< Module exactEval:security.
< 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 E X Ty L PrA : L1 |{stmt}- secdecl L Ty X E ~~> declare Ty X E PrB : L2 |{stmt}- secdecl L Ty X E ~~> S2 IsS : is_stmt (secdecl L Ty X E) 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 ============================ declare Ty X E = S2
< PrB: case PrB. Variables: L1 L2 E X Ty L PrA : L1 |{stmt}- secdecl L Ty X E ~~> declare Ty X E IsS : is_stmt (secdecl L Ty X E) 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 ============================ declare Ty X E = declare Ty X E
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_is. Variables: L E X Ty L1 Pr : L |{stmt}- secdecl L1 Ty X E ~~> declare Ty X E IsS : is_stmt (secdecl L1 Ty X E) IsL : is_list is_string L ============================ is_stmt (declare Ty X E)
< case IsS. Variables: L E X Ty L1 Pr : L |{stmt}- secdecl L1 Ty X E ~~> declare Ty X E IsL : is_list is_string L H1 : is_slev L1 H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_stmt (declare Ty X E)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_other. Variables: L L' E X Ty L1 Pr : L |{stmt}- secdecl L1 Ty X E ~~> declare Ty X E IsS : is_stmt (secdecl L1 Ty X E) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists S'', L' |{stmt}- secdecl L1 Ty X E ~~> S''
< case IsS. Variables: L L' E X Ty L1 Pr : L |{stmt}- secdecl L1 Ty X E ~~> declare Ty X E IsL : is_list is_string L IsL' : is_list is_string L' H1 : is_slev L1 H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ exists S'', L' |{stmt}- secdecl L1 Ty X E ~~> S''
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_unique. Variables: F2 Body Params RVVal RetVar RetTy Name RetLev PrA : |{fun}- secfun Name RetTy RetLev RetVar RVVal Params Body ~~> fun Name RetTy RetVar RVVal Params Body PrB : |{fun}- secfun Name RetTy RetLev RetVar RVVal Params Body ~~> F2 IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) ============================ fun Name RetTy RetVar RVVal Params Body = F2
< case PrB. Variables: Body Params RVVal RetVar RetTy Name RetLev PrA : |{fun}- secfun Name RetTy RetLev RetVar RVVal Params Body ~~> fun Name RetTy RetVar RVVal Params Body IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) ============================ fun Name RetTy RetVar RVVal Params Body = fun Name RetTy RetVar RVVal Params Body
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_is. Variables: Body Params RVVal RetVar RetTy Name RetLev Pr : |{fun}- secfun Name RetTy RetLev RetVar RVVal Params Body ~~> fun Name RetTy RetVar RVVal Params Body IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) ============================ is_fun (fun Name RetTy RetVar RVVal Params Body)
< case IsF. Variables: Body Params RVVal RetVar RetTy Name RetLev Pr : |{fun}- secfun Name RetTy RetLev RetVar RVVal Params Body ~~> fun Name RetTy RetVar RVVal Params Body H1 : is_string Name H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body ============================ is_fun (fun Name RetTy RetVar RVVal Params Body)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_param_unique. Variables: P2 Ty Name L PrA : |{param}- secparam Name Ty L ~~> param Name Ty PrB : |{param}- secparam Name Ty L ~~> P2 IsP : is_param (secparam Name Ty L) ============================ param Name Ty = P2
< case PrB. Variables: Ty Name L PrA : |{param}- secparam Name Ty L ~~> param Name Ty IsP : is_param (secparam Name Ty L) ============================ param Name Ty = param Name Ty
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_param_is. Variables: Ty Name L Pr : |{param}- secparam Name Ty L ~~> param Name Ty IsP : is_param (secparam Name Ty L) ============================ is_param (param Name Ty)
< case IsP. Variables: Ty Name L Pr : |{param}- secparam Name Ty L ~~> param Name Ty H1 : is_string Name H2 : is_typ Ty H3 : is_slev L ============================ is_param (param Name Ty)
< search. 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.
< Extensible_Theorem is_slev_public_or_not : forall L, IsL : is_slev L -> L = public \/ (L = public -> false) on IsL. Subgoal 1: IH : forall L, is_slev L * -> L = public \/ (L = public -> false) IsL : is_slev private @ ============================ private = public \/ (private = public -> false)
< search. Subgoal 2: IH : forall L, is_slev L * -> L = public \/ (L = public -> false) IsL : is_slev public @ ============================ public = public \/ (public = public -> false)
< search. Proof completed.
< Extensible_Theorem is_slev_private_or_not : forall L, IsL : is_slev L -> L = private \/ (L = private -> false) on IsL. Subgoal 1: IH : forall L, is_slev L * -> L = private \/ (L = private -> false) IsL : is_slev private @ ============================ private = private \/ (private = private -> false)
< search. Subgoal 2: IH : forall L, is_slev L * -> L = private \/ (L = private -> false) IsL : is_slev public @ ============================ public = private \/ (public = private -> false)
< search. Proof completed.
< Extensible_Theorem is_slev_eq_or_not : forall L1 L2, IsL1 : is_slev L1 -> IsL2 : is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) on IsL1. Subgoal 1: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev private @ IsL2 : is_slev L2 ============================ private = L2 \/ (private = L2 -> false)
< Or: apply is_slev_private_or_not to IsL2. Subgoal 1: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev private @ IsL2 : is_slev L2 Or : L2 = private \/ (L2 = private -> false) ============================ private = L2 \/ (private = L2 -> false)
< N: case Or. Subgoal 1.1: IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev private @ IsL2 : is_slev private ============================ private = private \/ (private = private -> false)
< search. Subgoal 1.2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev private @ IsL2 : is_slev L2 N : L2 = private -> false ============================ private = L2 \/ (private = L2 -> false)
< right. Subgoal 1.2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev private @ IsL2 : is_slev L2 N : L2 = private -> false ============================ private = L2 -> false
< intros E. Subgoal 1.2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev private @ IsL2 : is_slev L2 N : L2 = private -> false E : private = L2 ============================ false
< case E. Subgoal 1.2: IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev private @ IsL2 : is_slev private N : private = private -> false ============================ false
< backchain N. Subgoal 2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev public @ IsL2 : is_slev L2 ============================ public = L2 \/ (public = L2 -> false)
< Or: apply is_slev_public_or_not to IsL2. Subgoal 2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev public @ IsL2 : is_slev L2 Or : L2 = public \/ (L2 = public -> false) ============================ public = L2 \/ (public = L2 -> false)
< N: case Or. Subgoal 2.1: IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev public @ IsL2 : is_slev public ============================ public = public \/ (public = public -> false)
< search. Subgoal 2.2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev public @ IsL2 : is_slev L2 N : L2 = public -> false ============================ public = L2 \/ (public = L2 -> false)
< right. Subgoal 2.2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev public @ IsL2 : is_slev L2 N : L2 = public -> false ============================ public = L2 -> false
< intros E. Subgoal 2.2: Variables: L2 IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev public @ IsL2 : is_slev L2 N : L2 = public -> false E : public = L2 ============================ false
< case E. Subgoal 2.2: IH : forall L1 L2, is_slev L1 * -> is_slev L2 -> L1 = L2 \/ (L1 = L2 -> false) IsL1 : is_slev public @ IsL2 : is_slev public N : public = public -> false ============================ false
< backchain N. 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 S1 Typ Slev 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 (secdecl Slev Typ S1 Expr) @ R1 : is_slev Slev R2 : is_typ Typ R3 : is_string S1 R4 : is_expr Expr * ============================ <is_stmt {P}> (secdecl Slev Typ S1 Expr)
< apply IH to R4. Subgoal 4.10: Variables: Expr S1 Typ Slev 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 (secdecl Slev Typ S1 Expr) @ R1 : is_slev Slev R2 : is_typ Typ R3 : is_string S1 R4 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (secdecl Slev Typ S1 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 Ctx1 Scope X E Ty L 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 (secdecl L Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (secdecl L Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * ============================ is_list is_string N
< case IsS. Subgoal 1.12: Variables: N Ctx1 Scope X E Ty L 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) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (secdecl L Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_list is_string N
< apply IH_E to _ _ SN1. Subgoal 1.12: Variables: N Ctx1 Scope X E Ty L 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) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (secdecl L Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 2.12: Variables: N Ctx1 Scope X E Ty L 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 (secdecl L Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (secdecl L Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * ============================ is_list (is_list is_string) ((X::Scope)::Ctx1)
< case IsS. Subgoal 2.12: Variables: N Ctx1 Scope X E Ty L 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) (Scope::Ctx1) SN : stmtNames (Scope::Ctx1) (secdecl L Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_list (is_list is_string) ((X::Scope)::Ctx1)
< case IsCtx. Subgoal 2.12: Variables: N Ctx1 Scope X E Ty L 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 SN : stmtNames (Scope::Ctx1) (secdecl L Ty X E) N ((X::Scope)::Ctx1) @ SN1 : exprNames (Scope::Ctx1) E N * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_list is_string Scope H6 : is_list (is_list is_string) Ctx1 ============================ is_list (is_list is_string) ((X::Scope)::Ctx1)
< search. Proof completed.
< Prove exactEval:host:stmtNames_unique, exactEval:host:exprNames_unique. Subgoal 1.12: Variables: NA NB CtxB Ctx1 Scope X E Ty L 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 (secdecl L Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (secdecl L Ty X E) NA ((X::Scope)::Ctx1) @ SNB : stmtNames (Scope::Ctx1) (secdecl L Ty X E) NB CtxB SNA1 : exprNames (Scope::Ctx1) E NA * ============================ NA = NB /\ (X::Scope)::Ctx1 = CtxB
< case IsS. Subgoal 1.12: Variables: NA NB CtxB Ctx1 Scope X E Ty L 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) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (secdecl L Ty X E) NA ((X::Scope)::Ctx1) @ SNB : stmtNames (Scope::Ctx1) (secdecl L Ty X E) NB CtxB SNA1 : exprNames (Scope::Ctx1) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ NA = NB /\ (X::Scope)::Ctx1 = CtxB
< SNB: case SNB. Subgoal 1.12: Variables: NA NB Ctx1 Scope X E Ty L 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) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (secdecl L Ty X E) NA ((X::Scope)::Ctx1) @ SNA1 : exprNames (Scope::Ctx1) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SNB : exprNames (Scope::Ctx1) E NB ============================ NA = NB /\ (X::Scope)::Ctx1 = (X::Scope)::Ctx1
< apply IH_E to _ _ SNA1 SNB. Subgoal 1.12: Variables: NB Ctx1 Scope X E Ty L 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) (Scope::Ctx1) SNA : stmtNames (Scope::Ctx1) (secdecl L Ty X E) NB ((X::Scope)::Ctx1) @ SNA1 : exprNames (Scope::Ctx1) E NB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SNB : exprNames (Scope::Ctx1) E NB ============================ NB = NB /\ (X::Scope)::Ctx1 = (X::Scope)::Ctx1
< search. Proof completed.
< Prove exactEval:host:stmtNames_keep_older. Subgoal 12: Variables: Scope Ctx N X E Ty L 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 (secdecl L Ty X E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (secdecl L Ty X E) N ((X::Scope)::Ctx) @ SN1 : exprNames (Scope::Ctx) E N * ============================ exists Scope', (X::Scope)::Ctx = Scope'::Ctx /\ (forall X1, mem X1 Scope -> mem X1 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 S1 Typ Slev 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 (secdecl Slev Typ S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_slev Slev IsS2 : is_typ Typ IsS3 : is_string S1 IsS4 : is_expr Expr * ============================ exists N Ctx', stmtNames (Scope::Ctx) (secdecl Slev Typ S1 Expr) N Ctx'
< apply IH_E to IsS4 IsCtx. Subgoal 1.10: Variables: Scope Ctx Expr S1 Typ Slev 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 (secdecl Slev Typ S1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_slev Slev IsS2 : is_typ Typ IsS3 : is_string S1 IsS4 : is_expr Expr * H1 : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (secdecl Slev Typ S1 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 X1 E Ty L 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 (secdecl L Ty X1 E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) N ((X1::Scope)::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E N * ============================ false
< case IsS. Subgoal 1.12: Variables: Scope Ctx N X X1 E Ty L 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) (secdecl L Ty X1 E) N ((X1::Scope)::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E N * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ false
< apply IH_E to _ _ SN1 MemN MemsCtx. Proof completed.
< Prove exactEval:host:stmtNames_relatedCtxs, exactEval:host:stmtNames_relatedCtxs_ctx_fwd, exactEval:host:stmtNames_relatedCtxs_ctx_back, exactEval:host:exprNames_relatedCtxs. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB X E Ty L 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 (secdecl L Ty X E) 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) (secdecl L Ty X E) N ((X::ScopeA)::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * ============================ exists CtxB', stmtNames (ScopeB::CtxB) (secdecl L Ty X E) N CtxB'
< case IsS. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB X E Ty L 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) (secdecl L Ty X E) N ((X::ScopeA)::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (secdecl L Ty X E) N CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN1. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB X E Ty L 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) (secdecl L Ty X E) N ((X::ScopeA)::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E N * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : exprNames (ScopeB::CtxB) E N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (secdecl L Ty X E) N CtxB'
< search. Subgoal 2.12: Variables: NA CtxB NB CtxB' X Ctx Scope X1 E Ty L 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 CtxB SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNB : stmtNames CtxB (secdecl L Ty X1 E) NB CtxB' Mems : mems X ((X1::Scope)::Ctx) SNA1 : exprNames (Scope::Ctx) E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.12: Variables: NA CtxB NB CtxB' X Ctx Scope X1 E Ty L 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 CtxB SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNB : stmtNames CtxB (secdecl L Ty X1 E) NB CtxB' Mems : mems X ((X1::Scope)::Ctx) SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.12: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ Mems : mems X ((X1::Scope)::Ctx) SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X ((X1::Scope1)::Ctx1)
< M: case Mems. Subgoal 2.12.1: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X (X1::Scope) ============================ mems X ((X1::Scope1)::Ctx1)
< M: case M. Subgoal 2.12.1.1: Variables: NA NB Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X1 ((X1::Scope1)::Ctx1)
< search. Subgoal 2.12.1.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope ============================ mems X ((X1::Scope1)::Ctx1)
< M': apply RelAB to _ with X1 = X. Subgoal 2.12.1.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope M' : mems X (Scope1::Ctx1) ============================ mems X ((X1::Scope1)::Ctx1)
< case M'. Subgoal 2.12.1.2.1: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope H5 : mem X Scope1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 2.12.1.2.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope H5 : mems X Ctx1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 2.12.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx ============================ mems X ((X1::Scope1)::Ctx1)
< M': apply RelAB to _ with X1 = X. Subgoal 2.12.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx M' : mems X (Scope1::Ctx1) ============================ mems X ((X1::Scope1)::Ctx1)
< case M'. Subgoal 2.12.2.1: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx H5 : mem X Scope1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 2.12.2.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelAB : forall X1, mems X1 (Scope::Ctx) -> mems X1 (Scope1::Ctx1) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx H5 : mems X Ctx1 ============================ mems X ((X1::Scope1)::Ctx1)
< search. Subgoal 3.12: Variables: NA CtxB NB CtxB' X Ctx Scope X1 E Ty L 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNB : stmtNames CtxB (secdecl L Ty X1 E) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames (Scope::Ctx) E NA * ============================ mems X ((X1::Scope)::Ctx)
< SNB: case SNB. Subgoal 3.12: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ Mems : mems X ((X1::Scope1)::Ctx1) SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X ((X1::Scope)::Ctx)
< M: case Mems. Subgoal 3.12.1: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mem X (X1::Scope1) ============================ mems X ((X1::Scope)::Ctx)
< M: case M. Subgoal 3.12.1.1: Variables: NA NB Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB ============================ mems X1 ((X1::Scope)::Ctx)
< search. Subgoal 3.12.1.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 ============================ mems X ((X1::Scope)::Ctx)
< M': apply RelBA to _ with X1 = X. Subgoal 3.12.1.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 M' : mems X (Scope::Ctx) ============================ mems X ((X1::Scope)::Ctx)
< case M'. Subgoal 3.12.1.2.1: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 H1 : mem X Scope ============================ mems X ((X1::Scope)::Ctx)
< search. Subgoal 3.12.1.2.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mem X Scope1 H1 : mems X Ctx ============================ mems X ((X1::Scope)::Ctx)
< search. Subgoal 3.12.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx1 ============================ mems X ((X1::Scope)::Ctx)
< M': apply RelBA to _ with X1 = X. Subgoal 3.12.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx1 M' : mems X (Scope::Ctx) ============================ mems X ((X1::Scope)::Ctx)
< case M'. Subgoal 3.12.2.1: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx1 H1 : mem X Scope ============================ mems X ((X1::Scope)::Ctx)
< search. Subgoal 3.12.2.2: Variables: NA NB X Ctx Scope X1 E Ty L Ctx1 Scope1 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 (secdecl L Ty X1 E) IsCtxA : is_list (is_list is_string) (Scope::Ctx) IsCtxB : is_list (is_list is_string) (Scope1::Ctx1) RelBA : forall X1, mems X1 (Scope1::Ctx1) -> mems X1 (Scope::Ctx) SNA : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) NA ((X1::Scope)::Ctx) @ SNA1 : exprNames (Scope::Ctx) E NA * SNB : exprNames (Scope1::Ctx1) E NB M : mems X Ctx1 H1 : mems X Ctx ============================ mems X ((X1::Scope)::Ctx)
< search. 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 X1 E Ty L 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 (secdecl L Ty X1 E) 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (secdecl L Ty X1 E) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * ============================ mem X NA
< case IsS. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (secdecl L Ty X1 E) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mem X NA
< SNB: case SNB. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mem X NA
< apply IH_E to _ _ _ _ SNA1 SNB M. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB H5 : mem X NA ============================ mem X NA
< search. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X X1 E Ty L 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 (secdecl L Ty X1 E) 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (secdecl L Ty X1 E) NB CtxB' M : mems X ((X1::ScopeA)::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * ============================ mems X CtxB'
< case IsS. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (secdecl L Ty X1 E) NB CtxB' M : mems X ((X1::ScopeA)::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ M : mems X ((X1::ScopeA)::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mems X ((X1::ScopeB)::CtxB)
< M: case M. Subgoal 2.12.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X (X1::ScopeA) ============================ mems X ((X1::ScopeB)::CtxB)
< M: case M. Subgoal 2.12.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB ============================ mems X1 ((X1::ScopeB)::CtxB)
< search. Subgoal 2.12.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA ============================ mems X ((X1::ScopeB)::CtxB)
< M': apply RelAB to _ with X1 = X. Subgoal 2.12.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA M' : mems X (ScopeB::CtxB) ============================ mems X ((X1::ScopeB)::CtxB)
< case M'. Subgoal 2.12.1.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA H5 : mem X ScopeB ============================ mems X ((X1::ScopeB)::CtxB)
< search. Subgoal 2.12.1.2.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mem X ScopeA H5 : mems X CtxB ============================ mems X ((X1::ScopeB)::CtxB)
< search. Subgoal 2.12.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA ============================ mems X ((X1::ScopeB)::CtxB)
< M': apply RelAB to _ with X1 = X. Subgoal 2.12.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA M' : mems X (ScopeB::CtxB) ============================ mems X ((X1::ScopeB)::CtxB)
< case M'. Subgoal 2.12.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA H5 : mem X ScopeB ============================ mems X ((X1::ScopeB)::CtxB)
< search. Subgoal 2.12.2.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X X1 E Ty L 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) (secdecl L Ty X1 E) NA ((X1::ScopeA)::CtxA) @ SNA1 : exprNames (ScopeA::CtxA) E NA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E SNB : exprNames (ScopeB::CtxB) E NB M : mems X CtxA H5 : mems X CtxB ============================ mems X ((X1::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 E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) N Ctx' SN_P : stmtNames (Scope::Ctx) (declare Ty X1 E) N_P Ctx'_P M : mem X N_P ============================ mem X N
< SN: case SN. Variables: Names Scope Ctx N N_P Ctx'_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (declare Ty X1 E) N_P Ctx'_P M : mem X N_P SN : exprNames (Scope::Ctx) E N ============================ mem X N
< SN_P: case SN_P. Variables: Names Scope Ctx N N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P SN : exprNames (Scope::Ctx) E N SN_P : exprNames (Scope::Ctx) E N_P ============================ mem X N
< case IsS. Variables: Names Scope Ctx N N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P SN : exprNames (Scope::Ctx) E N SN_P : exprNames (Scope::Ctx) E N_P H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mem X N
< apply exprNames_unique to _ _ SN SN_P. Variables: Names Scope Ctx N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P SN : exprNames (Scope::Ctx) E N_P SN_P : exprNames (Scope::Ctx) E N_P H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ 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 E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) N Ctx' SN_P : stmtNames (Scope::Ctx) (declare Ty X1 E) N_P Ctx'_P M : mems X Ctx' ============================ mems X Ctx'_P
< SN: case SN. Variables: Names Scope Ctx N N_P Ctx'_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (declare Ty X1 E) N_P Ctx'_P M : mems X ((X1::Scope)::Ctx) SN : exprNames (Scope::Ctx) E N ============================ mems X Ctx'_P
< SN_P: case SN_P. Variables: Names Scope Ctx N N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X ((X1::Scope)::Ctx) SN : exprNames (Scope::Ctx) E N SN_P : exprNames (Scope::Ctx) E N_P ============================ mems X ((X1::Scope)::Ctx)
< case IsS. Variables: Names Scope Ctx N N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X ((X1::Scope)::Ctx) SN : exprNames (Scope::Ctx) E N SN_P : exprNames (Scope::Ctx) E N_P H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mems X ((X1::Scope)::Ctx)
< apply exprNames_unique to _ _ SN SN_P. Variables: Names Scope Ctx N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X ((X1::Scope)::Ctx) SN : exprNames (Scope::Ctx) E N_P SN_P : exprNames (Scope::Ctx) E N_P H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mems X ((X1::Scope)::Ctx)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_backward. Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (secdecl L Ty X1 E) N Ctx' SN_P : stmtNames (Scope::Ctx) (declare Ty X1 E) N_P Ctx'_P M : mems X Ctx'_P ============================ mems X Ctx'
< SN: case SN. Variables: Names Scope Ctx N N_P Ctx'_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (declare Ty X1 E) N_P Ctx'_P M : mems X Ctx'_P SN : exprNames (Scope::Ctx) E N ============================ mems X ((X1::Scope)::Ctx)
< SN_P: case SN_P. Variables: Names Scope Ctx N N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsS : is_stmt (secdecl L Ty X1 E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X ((X1::Scope)::Ctx) SN : exprNames (Scope::Ctx) E N SN_P : exprNames (Scope::Ctx) E N_P ============================ mems X ((X1::Scope)::Ctx)
< case IsS. Variables: Names Scope Ctx N N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X ((X1::Scope)::Ctx) SN : exprNames (Scope::Ctx) E N SN_P : exprNames (Scope::Ctx) E N_P H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mems X ((X1::Scope)::Ctx)
< apply exprNames_unique to _ _ SN SN_P. Variables: Names Scope Ctx N_P X E X1 Ty L Pr : Names |{stmt}- secdecl L Ty X1 E ~~> declare Ty X1 E IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X ((X1::Scope)::Ctx) SN : exprNames (Scope::Ctx) E N_P SN_P : exprNames (Scope::Ctx) E N_P H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E ============================ mems X ((X1::Scope)::Ctx)
< search. Proof completed.
< Prove exactEval:host:typeOf_isTy, exactEval:host:stmtOK_isCtx. Subgoal 2.12: Variables: FT RestTC Scope Ty X E L 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 (secdecl L Ty X E) 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::RestTC) Ty : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * ============================ is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
< case IsS. Subgoal 2.12: Variables: FT RestTC Scope Ty X E L IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::RestTC) Ty : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
< case IsET. Subgoal 2.12: Variables: FT RestTC Scope Ty X E L IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT Ty : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_list (is_pair is_string is_typ) Scope H6 : is_list (is_list (is_pair is_string is_typ)) RestTC ============================ is_list (is_list (is_pair is_string is_typ)) (((X, Ty)::Scope)::RestTC)
< search. Proof completed.
< Prove exactEval:host:stmtOK_keep_scopes. Subgoal 12: Variables: FT N RestTC Scope Ty X E L 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 (secdecl L Ty X E) 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::RestTC) Ty : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ L : length (Scope::RestTC) N Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * ============================ length (((X, Ty)::Scope)::RestTC) N
< case L. Subgoal 12: Variables: FT N RestTC Scope Ty X E L N' 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 (secdecl L Ty X E) 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::RestTC) Ty : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::RestTC) E Ty * H1 : length RestTC N' H2 : 1 + N' = N ============================ length (((X, Ty)::Scope)::RestTC) N
< search. Proof completed.
< Prove exactEval:host:stmtOK_older_scopes_same. Subgoal 12: Variables: FT ET Scope Ty X E L 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 (secdecl L Ty X E) 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) (secdecl L Ty X E) (((X, Ty)::Scope)::ET) @ Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::ET) E Ty * ============================ exists Scope', ((X, Ty)::Scope)::ET = Scope'::ET
< search. Proof completed.
< Prove exactEval:host:stmtOK_first_scope_lookup_same. Subgoal 12: Variables: FT ET Scope X Ty Ty1 X1 E L 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 (secdecl L Ty1 X1 E) 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) (secdecl L Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * ============================ lookup ((X1, Ty1)::Scope) X Ty
< assert X1 = X -> false. Subgoal 12.1: Variables: FT ET Scope X Ty Ty1 X1 E L 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 (secdecl L Ty1 X1 E) 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) (secdecl L Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * ============================ X1 = X -> false
< intros E. Subgoal 12.1: Variables: FT ET Scope X Ty Ty1 X1 E L 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 (secdecl L Ty1 X1 E) 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) (secdecl L Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * E : X1 = X ============================ false
< case E. Subgoal 12.1: Variables: FT ET Scope X Ty Ty1 E L 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 (secdecl L Ty1 X E) 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) (secdecl L Ty1 X E) (((X, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X Ty2 : typeOf FT (Scope::ET) E Ty1 * ============================ false
< apply no_lookup to Ty1 L. Subgoal 12: Variables: FT ET Scope X Ty Ty1 X1 E L 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 (secdecl L Ty1 X1 E) 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) (secdecl L Ty1 X1 E) (((X1, Ty1)::Scope)::ET) @ L : lookup Scope X Ty Ty1 : no_lookup Scope X1 Ty2 : typeOf FT (Scope::ET) E Ty1 * H1 : X1 = X -> false ============================ lookup ((X1, Ty1)::Scope) X Ty
< search. Proof completed.
< Prove exactEval:host:typeOf_unique, exactEval:host:stmtOK_unique. Subgoal 2.12: Variables: FT ET_B ET_B' RestTC Scope Ty X E L 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyB : stmtOK FT ET_B (secdecl L Ty X E) ET_B' Lkp : lookup_all_scopes (Scope::RestTC) ET_B TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * ============================ lookup_all_scopes (((X, Ty)::Scope)::RestTC) ET_B'
< TyB: case TyB. Subgoal 2.12: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ Lkp : lookup_all_scopes (Scope::RestTC) (Scope1::RestTC1) TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty ============================ lookup_all_scopes (((X, Ty)::Scope)::RestTC) (((X, Ty)::Scope1)::RestTC1)
< R: case Lkp. Subgoal 2.12: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 ============================ lookup_all_scopes (((X, Ty)::Scope)::RestTC) (((X, Ty)::Scope1)::RestTC1)
< unfold . Subgoal 2.12.1: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 ============================ forall X1 V, lookup ((X, Ty)::Scope) X1 V -> lookup ((X, Ty)::Scope1) X1 V
< intros L. Subgoal 2.12.1: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 V 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 L : lookup ((X, Ty)::Scope) X1 V ============================ lookup ((X, Ty)::Scope1) X1 V
< L: case L. Subgoal 2.12.1.1: Variables: FT RestTC Scope E L RestTC1 Scope1 X1 V 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 (secdecl L V X1 E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L V X1 E) (((X1, V)::Scope)::RestTC) @ TyA1 : no_lookup Scope X1 TyA2 : typeOf FT (Scope::RestTC) E V * TyB : no_lookup Scope1 X1 TyB1 : typeOf FT (Scope1::RestTC1) E V R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 ============================ lookup ((X1, V)::Scope1) X1 V
< search. Subgoal 2.12.1.2: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 V 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 L : X = X1 -> false L1 : lookup Scope X1 V ============================ lookup ((X, Ty)::Scope1) X1 V
< apply R to L1. Subgoal 2.12.1.2: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 V 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 L : X = X1 -> false L1 : lookup Scope X1 V H1 : lookup Scope1 X1 V ============================ lookup ((X, Ty)::Scope1) X1 V
< search. Subgoal 2.12.2: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 ============================ forall X1, is_string X1 -> no_lookup ((X, Ty)::Scope) X1 -> no_lookup ((X, Ty)::Scope1) X1
< intros IsX1 NL. Subgoal 2.12.2: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 IsX1 : is_string X1 NL : no_lookup ((X, Ty)::Scope) X1 ============================ no_lookup ((X, Ty)::Scope1) X1
< NL: case NL. Subgoal 2.12.2: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 IsX1 : is_string X1 NL : X = X1 -> false NL1 : no_lookup Scope X1 ============================ no_lookup ((X, Ty)::Scope1) X1
< apply R1 to _ NL1. Subgoal 2.12.2: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 X1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 IsX1 : is_string X1 NL : X = X1 -> false NL1 : no_lookup Scope X1 H1 : no_lookup Scope1 X1 ============================ no_lookup ((X, Ty)::Scope1) X1
< search. Subgoal 2.12.3: Variables: FT RestTC Scope Ty X E L RestTC1 Scope1 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 (secdecl L Ty X E) 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)) (Scope::RestTC) IsB : is_list (is_list (is_pair is_string is_typ)) (Scope1::RestTC1) TyA : stmtOK FT (Scope::RestTC) (secdecl L Ty X E) (((X, Ty)::Scope)::RestTC) @ TyA1 : no_lookup Scope X TyA2 : typeOf FT (Scope::RestTC) E Ty * TyB : no_lookup Scope1 X TyB1 : typeOf FT (Scope1::RestTC1) E Ty R : forall X V, lookup Scope X V -> lookup Scope1 X V R1 : forall X, is_string X -> no_lookup Scope X -> no_lookup Scope1 X R2 : lookup_all_scopes RestTC RestTC1 ============================ lookup_all_scopes RestTC RestTC1
< search. Proof completed.
< Prove exactEval:host:paramTy_is. Subgoal 2: Variables: N T L IH : forall P N T, is_param P -> paramTy P N T * -> is_string N /\ is_typ T IsP : is_param (secparam N T L) PT : paramTy (secparam N T L) N T @ ============================ is_string N /\ is_typ T
< case IsP. Subgoal 2: Variables: N T L IH : forall P N T, is_param P -> paramTy P N T * -> is_string N /\ is_typ T PT : paramTy (secparam N T L) N T @ H1 : is_string N H2 : is_typ T H3 : is_slev L ============================ is_string N /\ is_typ T
< search. Proof completed.
< Prove exactEval:host:getFunInfo_is. Subgoal 2: Variables: N R P NameTys Body Params RVVal RetVar RetLev IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P IsF : is_fun (secfun N R RetLev RetVar RVVal Params Body) GFI : getFunInfo (secfun N R RetLev RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< case IsF. Subgoal 2: Variables: N R P NameTys Body Params RVVal RetVar RetLev IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P GFI : getFunInfo (secfun N R RetLev RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P H1 : is_string N H2 : is_typ R H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< apply paramTys_is to _ GFI1. Subgoal 2: Variables: N R P NameTys Body Params RVVal RetVar RetLev IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P GFI : getFunInfo (secfun N R RetLev RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P H1 : is_string N H2 : is_typ R H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body H8 : is_list (is_pair is_string is_typ) NameTys ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< apply values_is_ty to _ GFI2. Subgoal 2: Variables: N R P NameTys Body Params RVVal RetVar RetLev IH : forall F N R P, is_fun F -> getFunInfo F N R P * -> (is_string N /\ is_typ R) /\ is_list is_typ P GFI : getFunInfo (secfun N R RetLev RetVar RVVal Params Body) N R P @ GFI1 : paramTys Params NameTys GFI2 : values NameTys P H1 : is_string N H2 : is_typ R H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body H8 : is_list (is_pair is_string is_typ) NameTys H9 : is_list is_typ P ============================ (is_string N /\ is_typ R) /\ is_list is_typ P
< search. Proof completed.
< Prove exactEval:host:paramTy_exists. Subgoal 2: Variables: Slev Typ S IH : forall P, is_param P * -> exists N T, paramTy P N T IsP : is_param (secparam S Typ Slev) @ IsP1 : is_string S IsP2 : is_typ Typ IsP3 : is_slev Slev ============================ exists N T, paramTy (secparam S Typ Slev) N T
< search. Proof completed.
< Prove exactEval:host:getFunInfo_exists. Subgoal 2: Variables: Stmt L Value S Slev Typ S1 IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (secfun S1 Typ Slev S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_slev Slev IsF4 : is_string S IsF5 : is_value Value IsF6 : is_list is_param L IsF7 : is_stmt Stmt ============================ exists N R P, getFunInfo (secfun S1 Typ Slev S Value L Stmt) N R P
< PT: apply paramTys_exists to IsF6. Subgoal 2: Variables: Stmt L Value S Slev Typ S1 PTys IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (secfun S1 Typ Slev S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_slev Slev IsF4 : is_string S IsF5 : is_value Value IsF6 : is_list is_param L IsF7 : is_stmt Stmt PT : paramTys L PTys ============================ exists N R P, getFunInfo (secfun S1 Typ Slev S Value L Stmt) N R P
< Is: apply paramTys_is to _ PT. Subgoal 2: Variables: Stmt L Value S Slev Typ S1 PTys IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (secfun S1 Typ Slev S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_slev Slev IsF4 : is_string S IsF5 : is_value Value IsF6 : is_list is_param L IsF7 : is_stmt Stmt PT : paramTys L PTys Is : is_list (is_pair is_string is_typ) PTys ============================ exists N R P, getFunInfo (secfun S1 Typ Slev S Value L Stmt) N R P
< apply values_exists_ty to Is. Subgoal 2: Variables: Stmt L Value S Slev Typ S1 PTys V IH : forall F, is_fun F * -> exists N R P, getFunInfo F N R P IsF : is_fun (secfun S1 Typ Slev S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_slev Slev IsF4 : is_string S IsF5 : is_value Value IsF6 : is_list is_param L IsF7 : is_stmt Stmt PT : paramTys L PTys Is : is_list (is_pair is_string is_typ) PTys H1 : values PTys V ============================ exists N R P, getFunInfo (secfun S1 Typ Slev S Value L Stmt) N R P
< search. 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 O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< case IsS. Subgoal 3.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< apply IH_V_E to _ _ _ Ev1. Subgoal 3.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< IsEE2+: apply IH_C_E to _ _ _ Ev1. Subgoal 3.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< case IsEE2+. Subgoal 3.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE2)
< 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 O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ is_list is_value O
< case IsS. Subgoal 2.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_list is_value O ============================ is_list is_value O
< search. Proof completed.
< Prove exactEval:host:paramName_is. Subgoal 2: Variables: N L Ty IH : forall P N, is_param P -> paramName P N * -> is_string N IsP : is_param (secparam N Ty L) PN : paramName (secparam N Ty L) N @ ============================ is_string N
< case IsP. Subgoal 2: Variables: N L Ty IH : forall P N, is_param P -> paramName P N * -> is_string N PN : paramName (secparam N Ty L) N @ H1 : is_string N H2 : is_typ Ty H3 : is_slev L ============================ is_string N
< search. Proof completed.
< Prove exactEval:host:getFunEvalInfo_is. Subgoal 2: Variables: Name RetVar RVVal PNames Body Params RetLev RetTy IH : forall F Name RetVar RVVal PNames Body, is_fun F -> getFunEvalInfo F Name RetVar RVVal PNames Body * -> (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) GEFI : getFunEvalInfo (secfun Name RetTy RetLev RetVar RVVal Params Body) Name RetVar RVVal PNames Body @ GEFI1 : paramNames Params PNames ============================ (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body
< case IsF. Subgoal 2: Variables: Name RetVar RVVal PNames Body Params RetLev RetTy IH : forall F Name RetVar RVVal PNames Body, is_fun F -> getFunEvalInfo F Name RetVar RVVal PNames Body * -> (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body GEFI : getFunEvalInfo (secfun Name RetTy RetLev RetVar RVVal Params Body) Name RetVar RVVal PNames Body @ GEFI1 : paramNames Params PNames H1 : is_string Name H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body ============================ (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body
< apply paramNames_is to _ GEFI1. Subgoal 2: Variables: Name RetVar RVVal PNames Body Params RetLev RetTy IH : forall F Name RetVar RVVal PNames Body, is_fun F -> getFunEvalInfo F Name RetVar RVVal PNames Body * -> (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body GEFI : getFunEvalInfo (secfun Name RetTy RetLev RetVar RVVal Params Body) Name RetVar RVVal PNames Body @ GEFI1 : paramNames Params PNames H1 : is_string Name H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body H8 : is_list is_string PNames ============================ (((is_string Name /\ is_string RetVar) /\ is_value RVVal) /\ is_list is_string PNames) /\ is_stmt Body
< search. 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 O EE2 Scope1 V X E Ty L 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 (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (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) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.15: Variables: FE Scope EE O EE2 Scope1 V X E Ty L 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE Scope EE O EE2 Scope1 V X E Ty L 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E NS : names_same (Scope::EE) (Scope1::EE2) ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.15: Variables: FE Scope EE O EE2 Scope1 V X E Ty L 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 H6 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope H7 : names_same EE EE2 ============================ exists Scope' EE'', ((X, V)::Scope1)::EE2 = 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_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty L 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 (secdecl L Ty X E) 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * ============================ O_A = O_B
< case IsS. Subgoal 4.15: Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty L 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.15: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 V X E Ty L EE2 Scope2 V1 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.15: Variables: FE EE_A EE_B O_B N Len Scope EE1 Scope1 V X E Ty L EE2 Scope2 V1 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_B * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B ============================ O_B = O_B
< search. Subgoal 5.15: Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty L 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 (secdecl L Ty X E) 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) EE_B'
< case IsS. Subgoal 5.15: Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope EE1 Scope1 V X E Ty L 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_A @ EvB : evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) EE_B'
< EvB: case EvB. Subgoal 5.15: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 V X E Ty L EE2 Scope2 V1 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.15: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 V X E Ty L EE2 Scope2 V1 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) ============================ newNameScopes N Len (((X, V)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.15: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< NNS': case NNS' (keep). Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenB': case LenB (keep). Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LEq: apply newNameScopes_length to NNS LenB'. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenEE2+: apply evalExpr_keep_scopes to _ _ _ EvB LenB. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< LenEE2: case LenEE2+ (keep). Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply length_is to LenB'. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 H5 : is_integer N' ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply length_is to LenEE2. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) Len NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : Len <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 H5 : is_integer N' H6 : is_integer N'1 ============================ newNameScopes N Len (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply length_unique to NNS'1 LenEE2+. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' N'1 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N N2 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N N2 (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) N2 NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N2 <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N'1 LenEE1 : 1 + N'1 = N2 H5 : is_integer N' H6 : is_integer N'1 ============================ newNameScopes N N2 (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply plus_integer_unique_addend to _ _ _ LenEE1 LenB'1. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N N2 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N N2 (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) N2 NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N2 <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N' LenEE1 : 1 + N' = N2 H5 : is_integer N' H6 : is_integer N' ============================ newNameScopes N N2 (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< L: apply lt_plus_one to LenEE1 _. Subgoal 5.15.1: Variables: FE EE_A EE_B O_A O_B N Scope EE1 Scope1 X E Ty L EE2 Scope2 V1 N1 SNames BNames N2 N' 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) (secdecl L Ty X E) (((X, V1)::Scope1)::EE1) O_A @ NNS : newNameScopes N N2 EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope1::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N N2 (Scope1::EE1) (Scope2::EE2) NNS'1 : length (Scope2::EE2) N2 NNS'2 : drop N1 (Scope1::EE1) (Scope2::EE2) NNS'3 : take N1 (Scope1::EE1) N NNS'4 : names N SNames NNS'5 : names (Scope2::EE2) BNames NNS'6 : forall X, mem X SNames -> mem X BNames -> false LenB : length (Scope::EE_B) N2 LenB' : length EE_B N' LenB'1 : 1 + N' = N2 LEq : N2 <= N' LenEE2+ : length (Scope2::EE2) N2 LenEE2 : length EE2 N' LenEE1 : 1 + N' = N2 H5 : is_integer N' H6 : is_integer N' L : N' < N2 ============================ newNameScopes N N2 (((X, V1)::Scope1)::EE1) (((X, V1)::Scope2)::EE2)
< apply less_lesseq_flip_false to L LEq. Subgoal 5.15.2: Variables: FE EE_A EE_B O_A O_B N Len Scope EE1 X E Ty L EE2 Scope2 V1 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) (secdecl L Ty X E) (((X, V1)::Scope2)::EE1) O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V1 (Scope2::EE1) O_A * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (Scope::EE_B) E V1 (Scope2::EE2) O_B NNS' : newNameScopes N Len (Scope2::EE1) (Scope2::EE2) NNS'1 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len (((X, V1)::Scope2)::EE1) (((X, V1)::Scope2)::EE2)
< 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 O N Len Scope ES N2 EE1 Scope1 V X E Ty L 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 (secdecl L Ty X E) 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L 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 (secdecl L Ty X E) 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 NNS'. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< Len_EE_A+: apply length_exists_list_pair_string_value to IsA. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 Len_EE_A+ : length (Scope::EE_A) N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 Len_EE_A+ : length (Scope::EE_A) N1 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< Len_EE_A': apply evalExpr_keep_scopes to _ _ _ EvA1' Len_EE_A+. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 Len_EE_A+ : length (Scope::EE_A) N1 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< Len: case Len_EE_A+. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 N' 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< GEq: apply length_geq_0 to Len. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 N' 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< apply length_is to Len. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 N' 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 H5 : is_integer N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< L: apply lt_plus_one to Len1 _. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 N' 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 GEq : N' >= 0 H5 : is_integer N' L : N' < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< LEq: case GEq. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 N' 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< apply lesseq_less_integer_transitive to LEq L. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L EE_A' N1 N' 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V EE_A' O N2 EvA1' : evalExpr FE (Scope::EE_A) E V EE_A' O Len_EE_A' : length EE_A' N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) EE_A' O ES
< apply length_cons to Len_EE_A' _. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope ES N2 EE1 Scope1 V X E Ty L N1 N' H T 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) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E V (Scope1::EE1) O N2 * NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V (H::T) O N2 EvA1' : evalExpr FE (Scope::EE_A) E V (H::T) O Len_EE_A' : length (H::T) N1 Len : length EE_A N' Len1 : 1 + N' = N1 H5 : is_integer N' L : N' < N1 LEq : 0 <= N' H6 : 0 < N1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (secdecl L Ty X E) 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 O Ctx Ctx' N EE2 Scope V X E Ty L 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 (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) N Ctx' Ev : evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ ctx_names (((X, V)::Scope)::EE2) Ctx'
< case IsS. Subgoal 2.15: Variables: FE EE O Ctx Ctx' N EE2 Scope V X E Ty L 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 (secdecl L Ty X E) N Ctx' Ev : evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ ctx_names (((X, V)::Scope)::EE2) Ctx'
< SN: case SN. Subgoal 2.15: Variables: FE EE O N EE2 Scope V X E Ty L Ctx1 Scope1 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) (Scope1::Ctx1) Ctxs : ctx_names EE (Scope1::Ctx1) Ev : evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SN : exprNames (Scope1::Ctx1) E N ============================ ctx_names (((X, V)::Scope)::EE2) ((X::Scope1)::Ctx1)
< apply IH_E to _ _ _ _ _ _ Ev1. Subgoal 2.15: Variables: FE EE O N EE2 Scope V X E Ty L Ctx1 Scope1 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) (Scope1::Ctx1) Ctxs : ctx_names EE (Scope1::Ctx1) Ev : evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SN : exprNames (Scope1::Ctx1) E N H5 : ctx_names (Scope::EE2) (Scope1::Ctx1) ============================ ctx_names (((X, V)::Scope)::EE2) ((X::Scope1)::Ctx1)
< backchain ctx_names_add. 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' O N Len Scope EE1 Scope1 V X E Ty L 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 (secdecl L Ty X E) 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 (secdecl L Ty X E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * ============================ exists EE_B', evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_B Ctx Ctx' O N Len Scope EE1 Scope1 V X E Ty L 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 (secdecl L Ty X E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O
< SN: case SN. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty L Ctx1 Scope2 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) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SN : exprNames (Scope2::Ctx1) E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O
< EvB: apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty L Ctx1 Scope2 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) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SN : exprNames (Scope2::Ctx1) E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs SN EvB. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty L Ctx1 Scope2 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) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SN : exprNames (Scope2::Ctx1) E [] EvB : evalExpr FE (Scope::EE_B) E V EE_B' O C : ctx_names EE_B' (Scope2::Ctx1) ============================ exists EE_B', evalStmt FE (Scope::EE_B) (secdecl L Ty X E) EE_B' O
< case C. Subgoal 2.15: Variables: FE EE_A EE_B O N Len Scope EE1 Scope1 V X E Ty L Ctx1 Scope2 ARest A 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) (Scope2::Ctx1) Ctxs : ctx_names (Scope::EE_B) (Scope2::Ctx1) EvA : evalStmt FE (Scope::EE_A) (secdecl L Ty X E) (((X, V)::Scope1)::EE1) O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E V (Scope1::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E SN : exprNames (Scope2::Ctx1) E [] EvB : evalExpr FE (Scope::EE_B) E V (A::ARest) O H5 : forall K I, mem (K, I) A -> mem K Scope2 H6 : forall K, mem K Scope2 -> exists I, mem (K, I) A H7 : ctx_names ARest Ctx1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (secdecl L Ty X E) 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 OA EE_B EE_B' OB EE1 Scope V X E Ty L 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 (secdecl L Ty X E) 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * ============================ OA = OB
< case IsS. Subgoal 3.15: Variables: FE EE_A OA EE_B EE_B' OB EE1 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.15: Variables: FE EE_A OA EE_B OB EE1 Scope V X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.15: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB ============================ OB = OB
< search. Subgoal 4.15: Variables: FE EE_A OA EE_B EE_B' OB EE1 Scope V X E Ty L 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 (secdecl L Ty X E) 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * ============================ scopes_same (((X, V)::Scope)::EE1) EE_B'
< case IsS. Subgoal 4.15: Variables: FE EE_A OA EE_B EE_B' OB EE1 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE EE_B (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ scopes_same (((X, V)::Scope)::EE1) EE_B'
< EvB: case EvB. Subgoal 4.15: Variables: FE EE_A OA EE_B OB EE1 Scope V X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB ============================ scopes_same (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< SS': apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.15: Variables: FE EE_A OA EE_B OB EE1 Scope V X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : scopes_same (Scope::EE1) (Scope1::EE2) ============================ scopes_same (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.15: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : scopes_same (Scope::EE1) (Scope1::EE2) ============================ scopes_same (((X, V1)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< SS': case SS'. Subgoal 4.15: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ scopes_same (((X, V1)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< unfold . Subgoal 4.15.1: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ forall X1 V, lookup ((X, V1)::Scope) X1 V -> lookup ((X, V1)::Scope1) X1 V
< intros L. Subgoal 4.15.1: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 X1 V2 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : lookup ((X, V1)::Scope) X1 V2 ============================ lookup ((X, V1)::Scope1) X1 V2
< L: case L. Subgoal 4.15.1.1: Variables: FE EE_A EE_B OB EE1 Scope E Ty L EE2 Scope1 X1 V2 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 (secdecl L Ty X1 E) (((X1, V2)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V2 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E EvB : evalExpr FE EE_B E V2 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ lookup ((X1, V2)::Scope1) X1 V2
< search. Subgoal 4.15.1.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 X1 V2 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope X1 V2 ============================ lookup ((X, V1)::Scope1) X1 V2
< apply SS' to L1. Subgoal 4.15.1.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 X1 V2 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope X1 V2 H5 : lookup Scope1 X1 V2 ============================ lookup ((X, V1)::Scope1) X1 V2
< search. Subgoal 4.15.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ forall X1 V, lookup ((X, V1)::Scope1) X1 V -> lookup ((X, V1)::Scope) X1 V
< intros L. Subgoal 4.15.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 X1 V2 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : lookup ((X, V1)::Scope1) X1 V2 ============================ lookup ((X, V1)::Scope) X1 V2
< L: case L. Subgoal 4.15.2.1: Variables: FE EE_A EE_B OB EE1 Scope E Ty L EE2 Scope1 X1 V2 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 (secdecl L Ty X1 E) (((X1, V2)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V2 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X1 H4 : is_expr E EvB : evalExpr FE EE_B E V2 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ lookup ((X1, V2)::Scope) X1 V2
< search. Subgoal 4.15.2.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 X1 V2 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope1 X1 V2 ============================ lookup ((X, V1)::Scope) X1 V2
< apply SS'1 to L1. Subgoal 4.15.2.2: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 X1 V2 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 L : X = X1 -> false L1 : lookup Scope1 X1 V2 H5 : lookup Scope X1 V2 ============================ lookup ((X, V1)::Scope) X1 V2
< search. Subgoal 4.15.3: Variables: FE EE_A EE_B OB EE1 Scope X E Ty L EE2 Scope1 V1 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 (secdecl L Ty X E) (((X, V1)::Scope)::EE1) OB @ EvA1 : evalExpr FE EE_A E V1 (Scope::EE1) OB * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V1 (Scope1::EE2) OB SS' : forall X V, lookup Scope X V -> lookup Scope1 X V SS'1 : forall X V, lookup Scope1 X V -> lookup Scope X V SS'2 : scopes_same EE1 EE2 ============================ scopes_same EE1 EE2
< 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 O EE_B EE1 Scope V X E Ty L 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 (secdecl L Ty X E) 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * ============================ exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
< case IsS. Subgoal 2.15: Variables: FE EE_A O EE_B EE1 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
< EvB: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.15: Variables: FE EE_A O EE_B EE1 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O ============================ exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB. Subgoal 2.15: Variables: FE EE_A O EE_B EE1 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V EE_B' O SS' : scopes_same (Scope::EE1) EE_B' ============================ exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
< case SS' (keep). Subgoal 2.15: Variables: FE EE_A O EE_B EE1 Scope V X E Ty L BRest 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V (B::BRest) O SS' : scopes_same (Scope::EE1) (B::BRest) H5 : forall X V, lookup Scope X V -> lookup B X V H6 : forall X V, lookup B X V -> lookup Scope X V H7 : scopes_same EE1 BRest ============================ exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.15: Variables: FE EE_A O EE_B EE1 Scope V X E Ty L BRest 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V (B::BRest) O SS' : scopes_same (Scope::EE1) (B::BRest) H5 : forall X V, lookup Scope X V -> lookup B X V H6 : forall X V, lookup B X V -> lookup Scope X V H7 : scopes_same EE1 BRest H8 : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.15: Variables: FE EE_A O EE_B EE1 Scope V X E Ty L BRest 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 (secdecl L Ty X E) (((X, V)::Scope)::EE1) O @ EvA1 : evalExpr FE EE_A E V (Scope::EE1) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE EE_B E V (B::BRest) O SS' : scopes_same (Scope::EE1) (B::BRest) H5 : forall X V, lookup Scope X V -> lookup B X V H6 : forall X V, lookup B X V -> lookup Scope X V H7 : scopes_same EE1 BRest H8 : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) H9 : is_list (is_list (is_pair is_string is_value)) (B::BRest) ============================ exists EE_B', evalStmt FE EE_B (secdecl L Ty X E) EE_B' O
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_backward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_forward. Variables: Names FE EE EE' O E X Ty L Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) EE' O ============================ exists EE'', evalStmt FE EE (declare Ty X E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O ============================ exists EE'', evalStmt FE EE (declare Ty X E) EE'' O /\ scopes_same (((X, V)::Scope)::EE2) EE''
< exists ((X, V)::Scope)::EE2. Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O ============================ evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O /\ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< split. Subgoal 1: Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O ============================ evalStmt FE EE (declare Ty X E) (((X, V)::Scope)::EE2) O
< search. Subgoal 2: Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< case IsS. Subgoal 2: Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 2: Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< IsEE2+: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< case IsEE2+. Subgoal 2: Variables: Names FE EE O E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< backchain scopes_same_reflexive. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_backward. Variables: Names FE EE EE' O Ctx Ctx' E X Ty L Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) [] Ctx' Ev : evalStmt FE EE (declare Ty X E) EE' O ============================ exists EE'', evalStmt FE EE (secdecl L Ty X E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O ============================ exists EE'', evalStmt FE EE (secdecl L Ty X E) EE'' O /\ scopes_same (((X, V)::Scope)::EE2) EE''
< exists ((X, V)::Scope)::EE2. Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O ============================ evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O /\ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< split. Subgoal 1: Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O ============================ evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< search. Subgoal 2: Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsS : is_stmt (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< case IsS. Subgoal 2: Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 2: Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< IsEE2+: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< case IsEE2+. Subgoal 2: Variables: Names FE EE O Ctx Ctx' E X Ty L EE2 Scope V Pr : Names |{stmt}- secdecl L Ty X E ~~> declare Ty X E Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (secdecl L Ty X E) [] Ctx' Ev : evalExpr FE EE E V (Scope::EE2) O H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_value V H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same (((X, V)::Scope)::EE2) (((X, V)::Scope)::EE2)
< backchain scopes_same_reflexive. Proof completed.
< Prove_Ext_Ind exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (secdecl L Ty X E) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E V (Scope::EE2) O N2 ** ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< case IsS. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< apply ext_size_is_int_evalExpr to R2. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_integer N2 ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< apply ext_size_pos_evalExpr to R2. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_integer N2 H6 : 0 <= N2 ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< Acc: case Acc. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_integer N2 H6 : 0 <= N2 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< L: apply lt_plus_one to R1 _. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_integer N2 H6 : 0 <= N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< A: apply Acc to _ L. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_integer N2 H6 : 0 <= N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< apply IH to R2 A _ _ _. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_integer N2 H6 : 0 <= N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H7 : <evalExpr {P}> FE EE E V (Scope::EE2) O ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< apply names_exists to IsEE. Subgoal 4.15: Variables: N FE EE O N2 EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O N2 ** H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_integer N2 H6 : 0 <= N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H7 : <evalExpr {P}> FE EE E V (Scope::EE2) O H8 : names EE N1 ============================ <evalStmt {P}> FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) O
< search. Proof completed.
< Prove exactEval:host:paramName_unique. Subgoal 2: Variables: NA NB L Ty IH : forall P NA NB, is_param P -> paramName P NA * -> paramName P NB -> NA = NB IsP : is_param (secparam NA Ty L) PA : paramName (secparam NA Ty L) NA @ PB : paramName (secparam NA Ty L) NB ============================ NA = NB
< case PB. Subgoal 2: Variables: NB L Ty IH : forall P NA NB, is_param P -> paramName P NA * -> paramName P NB -> NA = NB IsP : is_param (secparam NB Ty L) PA : paramName (secparam NB Ty L) NB @ ============================ NB = NB
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_forward. Variables: N Ty Name L Pr : |{param}- secparam Name Ty L ~~> param Name Ty IsP : is_param (secparam Name Ty L) PN : paramName (secparam Name Ty L) N ============================ paramName (param Name Ty) N
< case PN. Variables: N Ty L Pr : |{param}- secparam N Ty L ~~> param N Ty IsP : is_param (secparam N Ty L) ============================ paramName (param N Ty) N
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_back. Variables: N Ty Name L Pr : |{param}- secparam Name Ty L ~~> param Name Ty IsP : is_param (secparam Name Ty L) PN : paramName (param Name Ty) N ============================ paramName (secparam Name Ty L) N
< case PN. Variables: N Ty L Pr : |{param}- secparam N Ty L ~~> param N Ty IsP : is_param (secparam N Ty L) ============================ paramName (secparam N Ty L) N
< search. Proof completed.
< Prove exactEval:host:getFunEvalInfo_unique. Subgoal 2: Variables: NA RA VA PA BA NB RB VB PB BB Params RetLev RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB IsF : is_fun (secfun NA RetTy RetLev RA VA Params BA) GFEIA : getFunEvalInfo (secfun NA RetTy RetLev RA VA Params BA) NA RA VA PA BA @ GFEIB : getFunEvalInfo (secfun NA RetTy RetLev RA VA Params BA) NB RB VB PB BB GFEIA1 : paramNames Params PA ============================ (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB
< case IsF. Subgoal 2: Variables: NA RA VA PA BA NB RB VB PB BB Params RetLev RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB GFEIA : getFunEvalInfo (secfun NA RetTy RetLev RA VA Params BA) NA RA VA PA BA @ GFEIB : getFunEvalInfo (secfun NA RetTy RetLev RA VA Params BA) NB RB VB PB BB GFEIA1 : paramNames Params PA H1 : is_string NA H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RA H5 : is_value VA H6 : is_list is_param Params H7 : is_stmt BA ============================ (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB
< GFEIB: case GFEIB. Subgoal 2: Variables: PA NB RB VB PB BB Params RetLev RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB GFEIA : getFunEvalInfo (secfun NB RetTy RetLev RB VB Params BB) NB RB VB PA BB @ GFEIA1 : paramNames Params PA H1 : is_string NB H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RB H5 : is_value VB H6 : is_list is_param Params H7 : is_stmt BB GFEIB : paramNames Params PB ============================ (((NB = NB /\ RB = RB) /\ VB = VB) /\ PA = PB) /\ BB = BB
< apply paramNames_unique to _ GFEIA1 GFEIB. Subgoal 2: Variables: NB RB VB PB BB Params RetLev RetTy IH : forall F NA RA VA PA BA NB RB VB PB BB, is_fun F -> getFunEvalInfo F NA RA VA PA BA * -> getFunEvalInfo F NB RB VB PB BB -> (((NA = NB /\ RA = RB) /\ VA = VB) /\ PA = PB) /\ BA = BB GFEIA : getFunEvalInfo (secfun NB RetTy RetLev RB VB Params BB) NB RB VB PB BB @ GFEIA1 : paramNames Params PB H1 : is_string NB H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RB H5 : is_value VB H6 : is_list is_param Params H7 : is_stmt BB GFEIB : paramNames Params PB ============================ (((NB = NB /\ RB = RB) /\ VB = VB) /\ PB = PB) /\ BB = BB
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_forward. Variables: N R V P B Body Params RVVal RetVar RetTy Name RetLev Pr : |{fun}- secfun Name RetTy RetLev RetVar RVVal Params Body ~~> fun Name RetTy RetVar RVVal Params Body IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) GFEI : getFunEvalInfo (secfun Name RetTy RetLev RetVar RVVal Params Body) N R V P B ============================ getFunEvalInfo (fun Name RetTy RetVar RVVal Params Body) N R V P B
< case GFEI. Variables: N R V P B Params RetTy RetLev Pr : |{fun}- secfun N RetTy RetLev R V Params B ~~> fun N RetTy R V Params B IsF : is_fun (secfun N RetTy RetLev R V Params B) H1 : paramNames Params P ============================ getFunEvalInfo (fun N RetTy R V Params B) N R V P B
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_back. Variables: N R V P B Body Params RVVal RetVar RetTy Name RetLev Pr : |{fun}- secfun Name RetTy RetLev RetVar RVVal Params Body ~~> fun Name RetTy RetVar RVVal Params Body IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) GFEI : getFunEvalInfo (fun Name RetTy RetVar RVVal Params Body) N R V P B ============================ getFunEvalInfo (secfun Name RetTy RetLev RetVar RVVal Params Body) N R V P B
< case GFEI. Variables: N R V P B Params RetTy RetLev Pr : |{fun}- secfun N RetTy RetLev R V Params B ~~> fun N RetTy R V Params B IsF : is_fun (secfun N RetTy RetLev R V Params B) H1 : paramNames Params P ============================ getFunEvalInfo (secfun N RetTy RetLev R V Params B) N R V P B
< search. 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 O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) 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 (secdecl L Ty X E) ET' Ev : evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O * ============================ related_all_scopes ET' (((X, V)::Scope)::EE2)
< case IsS. Subgoal 3.15: Variables: FT ET ET' FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) ET' Ev : evalStmt FE EE (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ related_all_scopes ET' (((X, V)::Scope)::EE2)
< Ty: case Ty. Subgoal 3.15: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< apply IH_T_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.15: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< R: apply IH_C_E to _ _ _ _ _ Ty1 Ev1 _ _. Subgoal 3.15: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : related_all_scopes (Scope1::RestTC) (Scope::EE2) ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< R: case R. Subgoal 3.15: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE2)
< unfold . Subgoal 3.15.1: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ forall X1 T, lookup ((X, Ty)::Scope1) X1 T -> exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< intros L. Subgoal 3.15.1: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 T 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : lookup ((X, Ty)::Scope1) X1 T ============================ exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< L: case L. Subgoal 3.15.1.1: Variables: FT FE EE O EE2 Scope V E L RestTC Scope1 X1 T 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L T X1 E) (((X1, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ T H3 : is_string X1 H4 : is_expr E Ty : no_lookup Scope1 X1 Ty1 : typeOf FT (Scope1::RestTC) E T H5 : valueType V T R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ exists V1, lookup ((X1, V)::Scope) X1 V1 /\ valueType V1 T
< search. Subgoal 3.15.1.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 T 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T ============================ exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< apply R to L1. Subgoal 3.15.1.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 T V1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H6 : lookup Scope X1 V1 H7 : valueType V1 T ============================ exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< exists V1. Subgoal 3.15.1.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 T V1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H6 : lookup Scope X1 V1 H7 : valueType V1 T ============================ lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< split. Subgoal 3.15.1.2.1: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 T V1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H6 : lookup Scope X1 V1 H7 : valueType V1 T ============================ lookup ((X, V)::Scope) X1 V1
< search. Subgoal 3.15.1.2.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 T V1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 L : X = X1 -> false L1 : lookup Scope1 X1 T H6 : lookup Scope X1 V1 H7 : valueType V1 T ============================ valueType V1 T
< search. Subgoal 3.15.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ forall X1, no_lookup ((X, Ty)::Scope1) X1 -> no_lookup ((X, V)::Scope) X1
< intros N. Subgoal 3.15.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 N : no_lookup ((X, Ty)::Scope1) X1 ============================ no_lookup ((X, V)::Scope) X1
< N: case N. Subgoal 3.15.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 N : X = X1 -> false N1 : no_lookup Scope1 X1 ============================ no_lookup ((X, V)::Scope) X1
< apply R1 to N1. Subgoal 3.15.2: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 X1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 N : X = X1 -> false N1 : no_lookup Scope1 X1 H6 : no_lookup Scope X1 ============================ no_lookup ((X, V)::Scope) X1
< search. Subgoal 3.15.3: Variables: FT FE EE O EE2 Scope V X E Ty L RestTC Scope1 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)) (Scope1::RestTC) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) 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 (Scope1::RestTC) EE Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E Ty : no_lookup Scope1 X Ty1 : typeOf FT (Scope1::RestTC) E Ty H5 : valueType V Ty R : forall X T, lookup Scope1 X T -> exists V, lookup Scope X V /\ valueType V T R1 : forall X, no_lookup Scope1 X -> no_lookup Scope X R2 : related_all_scopes RestTC EE2 ============================ related_all_scopes RestTC EE2
< search. Proof completed.
< Prove exactEval:host:paramTy_paramName_same. Subgoal 2: Variables: NT T N L IH : forall P NT T N, paramTy P NT T * -> paramName P N -> NT = N PT : paramTy (secparam NT T L) NT T @ PN : paramName (secparam NT T L) N ============================ NT = N
< case PN. Subgoal 2: Variables: T N L IH : forall P NT T N, paramTy P NT T * -> paramName P N -> NT = N PT : paramTy (secparam N T L) N T @ ============================ N = N
< search. Proof completed.
< Prove exactEval:host:funOK_getFunEvalInfo_related. Subgoal 2: Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Body1 Params RVVal1 RetVar1 RetLev RetTy FunName IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (secfun FunName RetTy RetLev RetVar1 RVVal1 Params Body1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (secfun FunName RetTy RetLev RetVar1 RVVal1 Params Body1) @ GFEI : getFunEvalInfo (secfun FunName RetTy RetLev RetVar1 RVVal1 Params Body1) Name RetVar RVVal PNames Body FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar1, RetTy)::ParamTys] Body1 FinalTC FOK3 : lookup FT FunName (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar1 FOK6 : valueType RVVal1 RetTy ============================ exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys)
< GFEI: case GFEI. Subgoal 2: Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Params RetLev RetTy IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (secfun Name RetTy RetLev RetVar RVVal Params Body) @ FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC FOK3 : lookup FT Name (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar FOK6 : valueType RVVal RetTy GFEI : paramNames Params PNames ============================ exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys)
< Z: apply paramTys_values_names_zip_same to FOK1 FOK4 GFEI. Subgoal 2: Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Params RetLev RetTy IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (secfun Name RetTy RetLev RetVar RVVal Params Body) @ FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC FOK3 : lookup FT Name (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar FOK6 : valueType RVVal RetTy GFEI : paramNames Params PNames Z : zip PNames PTys ParamTys ============================ exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys)
< exists RetTy, PTys, ParamTys, FinalTC. Subgoal 2: Variables: FT Name RetVar RVVal PNames Body ParamTys FinalTC PTys Params RetLev RetTy IH : forall F FT Name RetVar RVVal PNames Body, is_fun F -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> funOK FT F * -> getFunEvalInfo F Name RetVar RVVal PNames Body -> exists RetTy ArgTys Scope TyEnv', (((lookup FT Name (RetTy, ArgTys) /\ zip PNames ArgTys Scope) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') /\ lookup FT Name (RetTy, ArgTys) IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT FOK : funOK FT (secfun Name RetTy RetLev RetVar RVVal Params Body) @ FOK1 : paramTys Params ParamTys FOK2 : stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC FOK3 : lookup FT Name (RetTy, PTys) FOK4 : values ParamTys PTys FOK5 : no_lookup ParamTys RetVar FOK6 : valueType RVVal RetTy GFEI : paramNames Params PNames Z : zip PNames PTys ParamTys ============================ (((lookup FT Name (RetTy, PTys) /\ zip PNames PTys ParamTys) /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::ParamTys] Body FinalTC) /\ lookup FT Name (RetTy, PTys)
< search. 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 O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * ============================ output_forms O
< case IsS. Subgoal 2.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE O EE2 Scope V X E Ty L 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 (secdecl L Ty X E) (((X, V)::Scope)::EE2) O @ Ev1 : evalExpr FE EE E V (Scope::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : output_forms O ============================ output_forms O
< search. Proof completed.
< Prove exactEval:host:evalProgram_output_forms. Proof completed.
< Prove exactEval:host:paramName_exists. Subgoal 2: Variables: Slev Typ S IH : forall P, is_param P * -> exists N, paramName P N IsP : is_param (secparam S Typ Slev) @ IsP1 : is_string S IsP2 : is_typ Typ IsP3 : is_slev Slev ============================ exists N, paramName (secparam S Typ Slev) N
< search. Proof completed.
< Prove exactEval:host:getFunEvalInfo_exists. Subgoal 2: Variables: Stmt L Value S Slev Typ S1 IH : forall F, is_fun F * -> exists N R V P B, getFunEvalInfo F N R V P B IsF : is_fun (secfun S1 Typ Slev S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_slev Slev IsF4 : is_string S IsF5 : is_value Value IsF6 : is_list is_param L IsF7 : is_stmt Stmt ============================ exists N R V P B, getFunEvalInfo (secfun S1 Typ Slev S Value L Stmt) N R V P B
< apply paramNames_exists to IsF6. Subgoal 2: Variables: Stmt L Value S Slev Typ S1 Ns IH : forall F, is_fun F * -> exists N R V P B, getFunEvalInfo F N R V P B IsF : is_fun (secfun S1 Typ Slev S Value L Stmt) @ IsF1 : is_string S1 IsF2 : is_typ Typ IsF3 : is_slev Slev IsF4 : is_string S IsF5 : is_value Value IsF6 : is_list is_param L IsF7 : is_stmt Stmt H1 : paramNames L Ns ============================ exists N R V P B, getFunEvalInfo (secfun S1 Typ Slev S Value L Stmt) N R V P B
< search. Proof completed.
< Extensible_Theorem join_is : forall L1 L2 R, Is1 : is_slev L1 -> Is2 : is_slev L2 -> J : join L1 L2 R -> is_slev R on J. Subgoal 1: IH : forall L1 L2 R, is_slev L1 -> is_slev L2 -> join L1 L2 R * -> is_slev R Is1 : is_slev public Is2 : is_slev public J : join public public public @ ============================ is_slev public
< search. Subgoal 2: Variables: L2 IH : forall L1 L2 R, is_slev L1 -> is_slev L2 -> join L1 L2 R * -> is_slev R Is1 : is_slev private Is2 : is_slev L2 J : join private L2 private @ ============================ is_slev private
< search. Subgoal 3: Variables: L1 IH : forall L1 L2 R, is_slev L1 -> is_slev L2 -> join L1 L2 R * -> is_slev R Is1 : is_slev L1 Is2 : is_slev private J : join L1 private private @ ============================ is_slev private
< search. Proof completed.
< Extensible_Theorem join_private_right : forall L R, Is : is_slev L -> J : join L private R -> R = private on J. Subgoal 1: IH : forall L R, is_slev L -> join L private R * -> R = private Is : is_slev private J : join private private private @ ============================ private = private
< search. Subgoal 2: Variables: L IH : forall L R, is_slev L -> join L private R * -> R = private Is : is_slev L J : join L private private @ ============================ private = private
< search. Proof completed.
< Extensible_Theorem join_unique : forall L1 L2 LA LB, Is1 : is_slev L1 -> Is2 : is_slev L2 -> JA : join L1 L2 LA -> JB : join L1 L2 LB -> LA = LB on JA. Subgoal 1: Variables: LB IH : forall L1 L2 LA LB, is_slev L1 -> is_slev L2 -> join L1 L2 LA * -> join L1 L2 LB -> LA = LB Is1 : is_slev public Is2 : is_slev public JA : join public public public @ JB : join public public LB ============================ public = LB
< JB: case JB. Subgoal 1: IH : forall L1 L2 LA LB, is_slev L1 -> is_slev L2 -> join L1 L2 LA * -> join L1 L2 LB -> LA = LB Is1 : is_slev public Is2 : is_slev public JA : join public public public @ ============================ public = public
< search. Subgoal 2: Variables: L2 LB IH : forall L1 L2 LA LB, is_slev L1 -> is_slev L2 -> join L1 L2 LA * -> join L1 L2 LB -> LA = LB Is1 : is_slev private Is2 : is_slev L2 JA : join private L2 private @ JB : join private L2 LB ============================ private = LB
< JB: case JB. Subgoal 2.1: Variables: L2 IH : forall L1 L2 LA LB, is_slev L1 -> is_slev L2 -> join L1 L2 LA * -> join L1 L2 LB -> LA = LB Is1 : is_slev private Is2 : is_slev L2 JA : join private L2 private @ ============================ private = private
< search. Subgoal 2.2: IH : forall L1 L2 LA LB, is_slev L1 -> is_slev L2 -> join L1 L2 LA * -> join L1 L2 LB -> LA = LB Is1 : is_slev private Is2 : is_slev private JA : join private private private @ ============================ private = private
< search. Subgoal 3: Variables: L1 LB IH : forall L1 L2 LA LB, is_slev L1 -> is_slev L2 -> join L1 L2 LA * -> join L1 L2 LB -> LA = LB Is1 : is_slev L1 Is2 : is_slev private JA : join L1 private private @ JB : join L1 private LB ============================ private = LB
< apply join_private_right to _ JB. Subgoal 3: Variables: L1 IH : forall L1 L2 LA LB, is_slev L1 -> is_slev L2 -> join L1 L2 LA * -> join L1 L2 LB -> LA = LB Is1 : is_slev L1 Is2 : is_slev private JA : join L1 private private @ JB : join L1 private private ============================ private = private
< search. Proof completed.
< Extensible_Theorem join_private : forall L1 L2, Is1 : is_slev L1 -> Is2 : is_slev L2 -> J : join L1 L2 private -> L1 = private \/ L2 = private on J. Subgoal 1: Variables: L2 IH : forall L1 L2, is_slev L1 -> is_slev L2 -> join L1 L2 private * -> L1 = private \/ L2 = private Is1 : is_slev private Is2 : is_slev L2 J : join private L2 private @ ============================ private = private \/ L2 = private
< search. Subgoal 2: Variables: L1 IH : forall L1 L2, is_slev L1 -> is_slev L2 -> join L1 L2 private * -> L1 = private \/ L2 = private Is1 : is_slev L1 Is2 : is_slev private J : join L1 private private @ ============================ L1 = private \/ private = private
< search. Proof completed.
< Extensible_Theorem join_public : forall L1 L2, Is1 : is_slev L1 -> Is2 : is_slev L2 -> J : join L1 L2 public -> L1 = public /\ L2 = public on J. IH : forall L1 L2, is_slev L1 -> is_slev L2 -> join L1 L2 public * -> L1 = public /\ L2 = public Is1 : is_slev public Is2 : is_slev public J : join public public public @ ============================ public = public /\ public = public
< search. Proof completed.
< Theorem lookup_is_slev : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev -> is_slev Lev. ============================ forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev -> is_slev Lev
< induction on 2. IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev ============================ forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev @ -> is_slev Lev
< intros Is L. Variables: L X Lev IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev Is : is_list (is_pair is_string is_slev) L L : lookup L X Lev @ ============================ is_slev Lev
< L: case L. Subgoal 1: Variables: X Lev Rest IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev Is : is_list (is_pair is_string is_slev) ((X, Lev)::Rest) ============================ is_slev Lev
< Is: case Is. Subgoal 1: Variables: X Lev Rest IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev Is : is_pair is_string is_slev (X, Lev) Is1 : is_list (is_pair is_string is_slev) Rest ============================ is_slev Lev
< case Is. Subgoal 1: Variables: X Lev Rest IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev Is1 : is_list (is_pair is_string is_slev) Rest H1 : is_string X H2 : is_slev Lev ============================ is_slev Lev
< search. Subgoal 2: Variables: X Lev Rest V K IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev Is : is_list (is_pair is_string is_slev) ((K, V)::Rest) L : K = X -> false L1 : lookup Rest X Lev * ============================ is_slev Lev
< case Is. Subgoal 2: Variables: X Lev Rest V K IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev L : K = X -> false L1 : lookup Rest X Lev * H1 : is_pair is_string is_slev (K, V) H2 : is_list (is_pair is_string is_slev) Rest ============================ is_slev Lev
< apply IH to _ L1. Subgoal 2: Variables: X Lev Rest V K IH : forall L X Lev, is_list (is_pair is_string is_slev) L -> lookup L X Lev * -> is_slev Lev L : K = X -> false L1 : lookup Rest X Lev * H1 : is_pair is_string is_slev (K, V) H2 : is_list (is_pair is_string is_slev) Rest H3 : is_slev Lev ============================ is_slev Lev
< search. Proof completed.
< Theorem lookupScopes_is_slev : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev -> is_slev Lev. ============================ forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev -> is_slev Lev
< induction on 2. IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev ============================ forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev @ -> is_slev Lev
< intros Is LS. Variables: SG X Lev IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev Is : is_list (is_list (is_pair is_string is_slev)) SG LS : lookupScopes X SG Lev @ ============================ is_slev Lev
< LS: case LS. Subgoal 1: Variables: X Lev Rest L IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev Is : is_list (is_list (is_pair is_string is_slev)) (L::Rest) LS : lookup L X Lev ============================ is_slev Lev
< case Is. Subgoal 1: Variables: X Lev Rest L IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev LS : lookup L X Lev H1 : is_list (is_pair is_string is_slev) L H2 : is_list (is_list (is_pair is_string is_slev)) Rest ============================ is_slev Lev
< apply lookup_is_slev to _ LS. Subgoal 1: Variables: X Lev Rest L IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev LS : lookup L X Lev H1 : is_list (is_pair is_string is_slev) L H2 : is_list (is_list (is_pair is_string is_slev)) Rest H3 : is_slev Lev ============================ is_slev Lev
< search. Subgoal 2: Variables: X Lev Rest L IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev Is : is_list (is_list (is_pair is_string is_slev)) (L::Rest) LS : no_lookup L X LS1 : lookupScopes X Rest Lev * ============================ is_slev Lev
< case Is. Subgoal 2: Variables: X Lev Rest L IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev LS : no_lookup L X LS1 : lookupScopes X Rest Lev * H1 : is_list (is_pair is_string is_slev) L H2 : is_list (is_list (is_pair is_string is_slev)) Rest ============================ is_slev Lev
< apply IH to _ LS1. Subgoal 2: Variables: X Lev Rest L IH : forall SG X Lev, is_list (is_list (is_pair is_string is_slev)) SG -> lookupScopes X SG Lev * -> is_slev Lev LS : no_lookup L X LS1 : lookupScopes X Rest Lev * H1 : is_list (is_pair is_string is_slev) L H2 : is_list (is_list (is_pair is_string is_slev)) Rest H3 : is_slev Lev ============================ is_slev Lev
< search. Proof completed.
< Theorem lookupSecFun_is : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) -> is_slev Lev /\ is_list is_slev PLs. ============================ forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) -> is_slev Lev /\ is_list is_slev PLs
< induction on 2. IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs ============================ forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) @ -> is_slev Lev /\ is_list is_slev PLs
< intros Is L. Variables: SF F Lev PLs IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs Is : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF L : lookup SF F (Lev, PLs) @ ============================ is_slev Lev /\ is_list is_slev PLs
< L: case L. Subgoal 1: Variables: F Lev PLs Rest IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs Is : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) ((F, (Lev, PLs))::Rest) ============================ is_slev Lev /\ is_list is_slev PLs
< Is: case Is. Subgoal 1: Variables: F Lev PLs Rest IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs Is : is_pair is_string (is_pair is_slev (is_list is_slev)) (F, (Lev, PLs)) Is1 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) Rest ============================ is_slev Lev /\ is_list is_slev PLs
< Is: case Is. Subgoal 1: Variables: F Lev PLs Rest IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs Is1 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) Rest Is : is_string F Is2 : is_pair is_slev (is_list is_slev) (Lev, PLs) ============================ is_slev Lev /\ is_list is_slev PLs
< case Is2. Subgoal 1: Variables: F Lev PLs Rest IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs Is1 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) Rest Is : is_string F H1 : is_slev Lev H2 : is_list is_slev PLs ============================ is_slev Lev /\ is_list is_slev PLs
< search. Subgoal 2: Variables: F Lev PLs Rest V K IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs Is : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) ((K, V)::Rest) L : K = F -> false L1 : lookup Rest F (Lev, PLs) * ============================ is_slev Lev /\ is_list is_slev PLs
< case Is. Subgoal 2: Variables: F Lev PLs Rest V K IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs L : K = F -> false L1 : lookup Rest F (Lev, PLs) * H1 : is_pair is_string (is_pair is_slev (is_list is_slev)) (K, V) H2 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) Rest ============================ is_slev Lev /\ is_list is_slev PLs
< apply IH to _ L1. Subgoal 2: Variables: F Lev PLs Rest V K IH : forall SF F Lev PLs, is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> lookup SF F (Lev, PLs) * -> is_slev Lev /\ is_list is_slev PLs L : K = F -> false L1 : lookup Rest F (Lev, PLs) * H1 : is_pair is_string (is_pair is_slev (is_list is_slev)) (K, V) H2 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) Rest H3 : is_slev Lev H4 : is_list is_slev PLs ============================ is_slev Lev /\ is_list is_slev PLs
< search. Proof completed.
< Theorem domain_is_sec : forall L D, is_list (is_pair is_string is_slev) L -> domain L D -> is_list is_string D. ============================ forall L D, is_list (is_pair is_string is_slev) L -> domain L D -> is_list is_string D
< induction on 2. IH : forall L D, is_list (is_pair is_string is_slev) L -> domain L D * -> is_list is_string D ============================ forall L D, is_list (is_pair is_string is_slev) L -> domain L D @ -> is_list is_string D
< intros Is D. Variables: L D IH : forall L D, is_list (is_pair is_string is_slev) L -> domain L D * -> is_list is_string D Is : is_list (is_pair is_string is_slev) L D : domain L D @ ============================ is_list is_string D
< D: case D. Subgoal 1: IH : forall L D, is_list (is_pair is_string is_slev) L -> domain L D * -> is_list is_string D Is : is_list (is_pair is_string is_slev) [] ============================ is_list is_string []
< search. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_slev) L -> domain L D * -> is_list is_string D Is : is_list (is_pair is_string is_slev) ((A, B)::Rest) D : domain Rest DRest * ============================ is_list is_string (A::DRest)
< Is: case Is. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_slev) L -> domain L D * -> is_list is_string D D : domain Rest DRest * Is : is_pair is_string is_slev (A, B) Is1 : is_list (is_pair is_string is_slev) Rest ============================ is_list is_string (A::DRest)
< case Is. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_slev) L -> domain L D * -> is_list is_string D D : domain Rest DRest * Is1 : is_list (is_pair is_string is_slev) Rest H1 : is_string A H2 : is_slev B ============================ is_list is_string (A::DRest)
< apply IH to _ D. Subgoal 2: Variables: DRest A Rest B IH : forall L D, is_list (is_pair is_string is_slev) L -> domain L D * -> is_list is_string D D : domain Rest DRest * Is1 : is_list (is_pair is_string is_slev) Rest H1 : is_string A H2 : is_slev B H3 : is_list is_string DRest ============================ is_list is_string (A::DRest)
< search. Proof completed.
< Theorem names_is_sec : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names -> is_list is_string Names. ============================ forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names -> is_list is_string Names
< induction on 2. IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names ============================ forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names @ -> is_list is_string Names
< intros Is N. Variables: SG Names IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names Is : is_list (is_list (is_pair is_string is_slev)) SG N : names SG Names @ ============================ is_list is_string Names
< N: case N. Subgoal 1: IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names Is : is_list (is_list (is_pair is_string is_slev)) [] ============================ is_list is_string []
< search. Subgoal 2: Variables: Names NScope NRest Rest Scope IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names Is : is_list (is_list (is_pair is_string is_slev)) (Scope::Rest) N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = Names ============================ is_list is_string Names
< case Is. Subgoal 2: Variables: Names NScope NRest Rest Scope IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = Names H1 : is_list (is_pair is_string is_slev) Scope H2 : is_list (is_list (is_pair is_string is_slev)) Rest ============================ is_list is_string Names
< apply domain_is_sec to _ N. Subgoal 2: Variables: Names NScope NRest Rest Scope IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = Names H1 : is_list (is_pair is_string is_slev) Scope H2 : is_list (is_list (is_pair is_string is_slev)) Rest H3 : is_list is_string NScope ============================ is_list is_string Names
< apply IH to _ N1. Subgoal 2: Variables: Names NScope NRest Rest Scope IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = Names H1 : is_list (is_pair is_string is_slev) Scope H2 : is_list (is_list (is_pair is_string is_slev)) Rest H3 : is_list is_string NScope H4 : is_list is_string NRest ============================ is_list is_string Names
< apply append_list_string_is to _ _ N2. Subgoal 2: Variables: Names NScope NRest Rest Scope IH : forall SG Names, is_list (is_list (is_pair is_string is_slev)) SG -> names SG Names * -> is_list is_string Names N : domain Scope NScope N1 : names Rest NRest * N2 : NScope ++ NRest = Names H1 : is_list (is_pair is_string is_slev) Scope H2 : is_list (is_list (is_pair is_string is_slev)) Rest H3 : is_list is_string NScope H4 : is_list is_string NRest H5 : is_list is_string Names ============================ is_list is_string Names
< search. Proof completed.
< Theorem mem_is_sec : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L -> is_pair is_string is_slev IDS. ============================ forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L -> is_pair is_string is_slev IDS
< induction on 2. IH : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L * -> is_pair is_string is_slev IDS ============================ forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L @ -> is_pair is_string is_slev IDS
< intros Is M. Variables: L IDS IH : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L * -> is_pair is_string is_slev IDS Is : is_list (is_pair is_string is_slev) L M : mem IDS L @ ============================ is_pair is_string is_slev IDS
< M: case M. Subgoal 1: Variables: IDS Rest IH : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L * -> is_pair is_string is_slev IDS Is : is_list (is_pair is_string is_slev) (IDS::Rest) ============================ is_pair is_string is_slev IDS
< case Is. Subgoal 1: Variables: IDS Rest IH : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L * -> is_pair is_string is_slev IDS H1 : is_pair is_string is_slev IDS H2 : is_list (is_pair is_string is_slev) Rest ============================ is_pair is_string is_slev IDS
< search. Subgoal 2: Variables: IDS Rest I IH : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L * -> is_pair is_string is_slev IDS Is : is_list (is_pair is_string is_slev) (I::Rest) M : mem IDS Rest * ============================ is_pair is_string is_slev IDS
< case Is. Subgoal 2: Variables: IDS Rest I IH : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L * -> is_pair is_string is_slev IDS M : mem IDS Rest * H1 : is_pair is_string is_slev I H2 : is_list (is_pair is_string is_slev) Rest ============================ is_pair is_string is_slev IDS
< apply IH to _ M. Subgoal 2: Variables: IDS Rest I IH : forall L IDS, is_list (is_pair is_string is_slev) L -> mem IDS L * -> is_pair is_string is_slev IDS M : mem IDS Rest * H1 : is_pair is_string is_slev I H2 : is_list (is_pair is_string is_slev) Rest H3 : is_pair is_string is_slev IDS ============================ is_pair is_string is_slev IDS
< search. Proof completed.
< Extensible_Theorem level_is : forall SF SG PC E L, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> Lev : level SF SG PC E L -> is_slev L on Lev as IH_E, secure_is : forall SF SG PC S SG', IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> Sec : secure SF SG PC S SG' -> is_list (is_list (is_pair is_string is_slev)) SG' on Sec as IH_Salso levelArgs_is : forall SF SG PC A L, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> Lev : levelArgs SF SG PC A L -> is_list is_slev L on Lev as IH_A, levelRecFields_is : forall SF SG PC RF L, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> Lev : levelRecFields SF SG PC RF L -> is_slev L on Lev as IH_RF. Subgoal 1.1: Variables: SF SG PC I IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (num I) public @ ============================ is_slev public
< search. Subgoal 1.2: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (plus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.2: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (plus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.2: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (plus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.2: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (plus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 1.2: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (plus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.3: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (minus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.3: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (minus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.3: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (minus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.3: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (minus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 1.3: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (minus E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.4: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (mult E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.4: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (mult E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.4: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (mult E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.4: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (mult E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 1.4: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (mult E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.5: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (div E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.5: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (div E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.5: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (div E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.5: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (div E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 1.5: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (div E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.6: Variables: SF SG PC IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC true public @ ============================ is_slev public
< search. Subgoal 1.7: Variables: SF SG PC IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC false public @ ============================ is_slev public
< search. Subgoal 1.8: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (and E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.8: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (and E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.8: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (and E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev3. Subgoal 1.8: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (and E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev4. Subgoal 1.8: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (and E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.9: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (or E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.9: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (or E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.9: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (or E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev3. Subgoal 1.9: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (or E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev4. Subgoal 1.9: Variables: SF SG PC L L2 Sl1 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (or E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : join L2 PC Sl1 Lev3 : level SF SG Sl1 E2 L3 * Lev4 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.10: Variables: SF SG PC L E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (not E1) L @ Lev1 : level SF SG PC E1 L * ============================ is_slev L
< case IsE. Subgoal 1.10: Variables: SF SG PC L E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (not E1) L @ Lev1 : level SF SG PC E1 L * H1 : is_expr E1 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.10: Variables: SF SG PC L E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (not E1) L @ Lev1 : level SF SG PC E1 L * H1 : is_expr E1 H2 : is_slev L ============================ is_slev L
< search. Subgoal 1.11: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (greater E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.11: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (greater E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.11: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (greater E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.11: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (greater E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 1.11: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (greater E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.12: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (eq E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.12: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (eq E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.12: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (eq E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.12: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (eq E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 1.12: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (eq E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.13: Variables: SF SG PC S IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (stringLit S) public @ ============================ is_slev public
< search. Subgoal 1.14: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (appString E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L ============================ is_slev L
< case IsE. Subgoal 1.14: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (appString E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.14: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (appString E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.14: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (appString E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 1.14: Variables: SF SG PC L L2 L3 E2 E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (appString E1 E2) L @ Lev1 : level SF SG PC E1 L2 * Lev2 : level SF SG PC E2 L3 * Lev3 : join L2 L3 L H1 : is_expr E1 H2 : is_expr E2 H3 : is_slev L2 H4 : is_slev L3 H5 : is_slev L ============================ is_slev L
< search. Subgoal 1.15: Variables: SF SG PC L X IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (name X) L @ Lev1 : lookupScopes X SG L ============================ is_slev L
< apply lookupScopes_is_slev to _ Lev1. Subgoal 1.15: Variables: SF SG PC L X IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (name X) L @ Lev1 : lookupScopes X SG L H1 : is_slev L ============================ is_slev L
< search. Subgoal 1.16: Variables: SF SG ArgLevs Args Fun IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG private (call Fun Args) private @ Lev1 : lookup SF Fun (private, ArgLevs) Lev2 : levelArgs SF SG private Args ArgLevs * ============================ is_slev private
< apply lookupSecFun_is to _ Lev1. Subgoal 1.16: Variables: SF SG ArgLevs Args Fun IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG private (call Fun Args) private @ Lev1 : lookup SF Fun (private, ArgLevs) Lev2 : levelArgs SF SG private Args ArgLevs * H1 : is_slev private H2 : is_list is_slev ArgLevs ============================ is_slev private
< search. Subgoal 1.17: Variables: SF SG L ArgLevs Args Fun IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG public (call Fun Args) L @ Lev1 : lookup SF Fun (L, ArgLevs) Lev2 : levelArgs SF SG public Args ArgLevs * ============================ is_slev L
< apply lookupSecFun_is to _ Lev1. Subgoal 1.17: Variables: SF SG L ArgLevs Args Fun IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG public (call Fun Args) L @ Lev1 : lookup SF Fun (L, ArgLevs) Lev2 : levelArgs SF SG public Args ArgLevs * H1 : is_slev L H2 : is_list is_slev ArgLevs ============================ is_slev L
< search. Subgoal 1.18: Variables: SF SG PC L SG2 E1 S IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (stmtExpr S E1) L @ Lev1 : secure SF ([]::SG) PC S SG2 * Lev2 : level SF SG2 PC E1 L * ============================ is_slev L
< case IsE. Subgoal 1.18: Variables: SF SG PC L SG2 E1 S IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (stmtExpr S E1) L @ Lev1 : secure SF ([]::SG) PC S SG2 * Lev2 : level SF SG2 PC E1 L * H1 : is_stmt S H2 : is_expr E1 ============================ is_slev L
< apply IH_S to _ _ _ Lev1. Subgoal 1.18: Variables: SF SG PC L SG2 E1 S IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (stmtExpr S E1) L @ Lev1 : secure SF ([]::SG) PC S SG2 * Lev2 : level SF SG2 PC E1 L * H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ is_slev L
< apply IH_E to _ _ _ Lev2. Subgoal 1.18: Variables: SF SG PC L SG2 E1 S IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (stmtExpr S E1) L @ Lev1 : secure SF ([]::SG) PC S SG2 * Lev2 : level SF SG2 PC E1 L * H1 : is_stmt S H2 : is_expr E1 H3 : is_list (is_list (is_pair is_string is_slev)) SG2 H4 : is_slev L ============================ is_slev L
< search. Subgoal 1.19: Variables: SF SG PC L Fields IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (recBuild Fields) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (recBuild Fields) L @ Lev1 : levelRecFields SF SG PC Fields L * ============================ is_slev L
< case IsE. Subgoal 1.19: Variables: SF SG PC L Fields IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (recBuild Fields) L @ Lev1 : levelRecFields SF SG PC Fields L * H1 : is_recFieldExprs Fields ============================ is_slev L
< apply IH_RF to _ _ _ Lev1. Subgoal 1.19: Variables: SF SG PC L Fields IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (recBuild Fields) L @ Lev1 : levelRecFields SF SG PC Fields L * H1 : is_recFieldExprs Fields H2 : is_slev L ============================ is_slev L
< search. Subgoal 1.20: Variables: SF SG PC L Field E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (recFieldAccess E1 Field) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (recFieldAccess E1 Field) L @ Lev1 : level SF SG PC E1 L * ============================ is_slev L
< case IsE. Subgoal 1.20: Variables: SF SG PC L Field E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (recFieldAccess E1 Field) L @ Lev1 : level SF SG PC E1 L * H1 : is_expr E1 H2 : is_string Field ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.20: Variables: SF SG PC L Field E1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (recFieldAccess E1 Field) L @ Lev1 : level SF SG PC E1 L * H1 : is_expr E1 H2 : is_string Field H3 : is_slev L ============================ is_slev L
< search. Subgoal 1.21: Variables: SF SG PC L Ty Msg IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr (errorExpr Msg Ty) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (errorExpr Msg Ty) L @ Lev1 : level SF SG PC Msg L * ============================ is_slev L
< case IsE. Subgoal 1.21: Variables: SF SG PC L Ty Msg IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (errorExpr Msg Ty) L @ Lev1 : level SF SG PC Msg L * H1 : is_expr Msg H2 : is_typ Ty ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 1.21: Variables: SF SG PC L Ty Msg IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC (errorExpr Msg Ty) L @ Lev1 : level SF SG PC Msg L * H1 : is_expr Msg H2 : is_typ Ty H3 : is_slev L ============================ is_slev L
< search. Subgoal 1.22: Variables: SF SG PC L Names E_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC <unknown I expr> L @ Lev1 : names SG Names Lev2 : Names |{expr}- <unknown I expr> ~~> E_P Lev3 : level SF SG PC E_P L * ============================ is_slev L
< apply names_is_sec to _ Lev1. Subgoal 1.22: Variables: SF SG PC L Names E_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC <unknown I expr> L @ Lev1 : names SG Names Lev2 : Names |{expr}- <unknown I expr> ~~> E_P Lev3 : level SF SG PC E_P L * H1 : is_list is_string Names ============================ is_slev L
< apply proj_expr_is to Lev2 _ _. Subgoal 1.22: Variables: SF SG PC L Names E_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC <unknown I expr> L @ Lev1 : names SG Names Lev2 : Names |{expr}- <unknown I expr> ~~> E_P Lev3 : level SF SG PC E_P L * H1 : is_list is_string Names H2 : is_expr E_P ============================ is_slev L
< apply IH_E to _ _ _ Lev3. Subgoal 1.22: Variables: SF SG PC L Names E_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : level SF SG PC <unknown I expr> L @ Lev1 : names SG Names Lev2 : Names |{expr}- <unknown I expr> ~~> E_P Lev3 : level SF SG PC E_P L * H1 : is_list is_string Names H2 : is_expr E_P H3 : is_slev L ============================ is_slev L
< search. Subgoal 2.1: Variables: SF PC SG' IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' PC noop SG' @ ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.2: Variables: SF SG PC SG' SG3 S2 S1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC (seq S1 S2) SG' @ Sec1 : secure SF SG PC S1 SG3 * Sec2 : secure SF SG3 PC S2 SG' * ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< case IsS. Subgoal 2.2: Variables: SF SG PC SG' SG3 S2 S1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC (seq S1 S2) SG' @ Sec1 : secure SF SG PC S1 SG3 * Sec2 : secure SF SG3 PC S2 SG' * H1 : is_stmt S1 H2 : is_stmt S2 ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< apply IH_S to _ _ _ Sec1. Subgoal 2.2: Variables: SF SG PC SG' SG3 S2 S1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC (seq S1 S2) SG' @ Sec1 : secure SF SG PC S1 SG3 * Sec2 : secure SF SG3 PC S2 SG' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_slev)) SG3 ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< apply IH_S to _ _ _ Sec2. Subgoal 2.2: Variables: SF SG PC SG' SG3 S2 S1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC (seq S1 S2) SG' @ Sec1 : secure SF SG PC S1 SG3 * Sec2 : secure SF SG3 PC S2 SG' * H1 : is_stmt S1 H2 : is_stmt S2 H3 : is_list (is_list (is_pair is_string is_slev)) SG3 H4 : is_list (is_list (is_pair is_string is_slev)) SG' ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.3: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) Sec : secure SF (Scope::SG1) public (declare Ty X E) (((X, public)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) public E public * Sec2 : no_lookup Scope X ============================ is_list (is_list (is_pair is_string is_slev)) (((X, public)::Scope)::SG1)
< case IsS. Subgoal 2.3: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) Sec : secure SF (Scope::SG1) public (declare Ty X E) (((X, public)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) public E public * Sec2 : no_lookup Scope X H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ is_list (is_list (is_pair is_string is_slev)) (((X, public)::Scope)::SG1)
< case IsSG. Subgoal 2.3: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF Sec : secure SF (Scope::SG1) public (declare Ty X E) (((X, public)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) public E public * Sec2 : no_lookup Scope X H1 : is_typ Ty H2 : is_string X H3 : is_expr E H4 : is_list (is_pair is_string is_slev) Scope H5 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ is_list (is_list (is_pair is_string is_slev)) (((X, public)::Scope)::SG1)
< search. Subgoal 2.4: Variables: SF PC SG' L E X IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' PC (assign X E) SG' @ Sec1 : level SF SG' PC E L * Sec2 : lookupScopes X SG' private ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.5: Variables: SF SG' E X IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' public (assign X E) SG' @ Sec1 : level SF SG' public E public * Sec2 : lookupScopes X SG' public ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.6: Variables: SF PC SG' L E Fields Rec IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' PC (recUpdate Rec Fields E) SG' @ Sec1 : level SF SG' PC E L * Sec2 : lookupScopes Rec SG' private ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.7: Variables: SF SG' E Fields Rec IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' public (recUpdate Rec Fields E) SG' @ Sec1 : level SF SG' public E public * Sec2 : lookupScopes Rec SG' public ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.8: Variables: SF PC SG' L Sl1 SGT SGF F T E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (ifThenElse E T F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' PC (ifThenElse E T F) SG' @ Sec1 : level SF SG' PC E L * Sec2 : join L PC Sl1 Sec3 : secure SF ([]::SG') Sl1 T SGT * Sec4 : secure SF ([]::SG') Sl1 F SGF * ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.9: Variables: SF SG' L Scope SG2 S1 E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' private (while E S1) SG' @ Sec1 : level SF SG' private E L * Sec2 : secure SF ([]::SG') private S1 (Scope::SG2) * ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.10: Variables: SF SG' Scope SG2 S1 E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' public (while E S1) SG' @ Sec1 : level SF SG' public E public * Sec2 : secure SF ([]::SG') public S1 (Scope::SG2) * ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.11: Variables: SF PC SG' Scope S1 IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' PC (scopeStmt S1) SG' @ Sec1 : secure SF ([]::SG') PC S1 (Scope::SG') * ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.12: Variables: SF SG' E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' Sec : secure SF SG' public (printVal E) SG' @ Sec1 : level SF SG' public E public * ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 2.13: Variables: SF PC L SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) Sec : secure SF (Scope::SG1) PC (secdecl private Ty X E) (((X, private)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) PC E L * Sec2 : no_lookup Scope X ============================ is_list (is_list (is_pair is_string is_slev)) (((X, private)::Scope)::SG1)
< case IsS. Subgoal 2.13: Variables: SF PC L SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) Sec : secure SF (Scope::SG1) PC (secdecl private Ty X E) (((X, private)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) PC E L * Sec2 : no_lookup Scope X H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_list (is_list (is_pair is_string is_slev)) (((X, private)::Scope)::SG1)
< case IsSG. Subgoal 2.13: Variables: SF PC L SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF Sec : secure SF (Scope::SG1) PC (secdecl private Ty X E) (((X, private)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) PC E L * Sec2 : no_lookup Scope X H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_list (is_pair is_string is_slev) Scope H6 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ is_list (is_list (is_pair is_string is_slev)) (((X, private)::Scope)::SG1)
< search. Subgoal 2.14: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) Sec : secure SF (Scope::SG1) public (secdecl public Ty X E) (((X, public)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) public E public * Sec2 : no_lookup Scope X ============================ is_list (is_list (is_pair is_string is_slev)) (((X, public)::Scope)::SG1)
< case IsS. Subgoal 2.14: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) Sec : secure SF (Scope::SG1) public (secdecl public Ty X E) (((X, public)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) public E public * Sec2 : no_lookup Scope X H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ is_list (is_list (is_pair is_string is_slev)) (((X, public)::Scope)::SG1)
< case IsSG. Subgoal 2.14: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF Sec : secure SF (Scope::SG1) public (secdecl public Ty X E) (((X, public)::Scope)::SG1) @ Sec1 : level SF (Scope::SG1) public E public * Sec2 : no_lookup Scope X H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E H5 : is_list (is_pair is_string is_slev) Scope H6 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ is_list (is_list (is_pair is_string is_slev)) (((X, public)::Scope)::SG1)
< search. Subgoal 2.15: Variables: SF SG PC SG' Names S_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC <unknown I stmt> SG' @ Sec1 : names SG Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF SG PC S_P SG' * ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< apply names_is_sec to _ Sec1. Subgoal 2.15: Variables: SF SG PC SG' Names S_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC <unknown I stmt> SG' @ Sec1 : names SG Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF SG PC S_P SG' * H1 : is_list is_string Names ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< apply proj_stmt_is to Sec2 _ _. Subgoal 2.15: Variables: SF SG PC SG' Names S_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC <unknown I stmt> SG' @ Sec1 : names SG Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF SG PC S_P SG' * H1 : is_list is_string Names H2 : is_stmt S_P ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< apply IH_S to _ _ _ Sec3. Subgoal 2.15: Variables: SF SG PC SG' Names S_P IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Sec : secure SF SG PC <unknown I stmt> SG' @ Sec1 : names SG Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF SG PC S_P SG' * H1 : is_list is_string Names H2 : is_stmt S_P H3 : is_list (is_list (is_pair is_string is_slev)) SG' ============================ is_list (is_list (is_pair is_string is_slev)) SG'
< search. Subgoal 3: Variables: SF SG PC A L IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelArgs SF SG PC A L @ ============================ is_list is_slev L
< Lev: case Lev (keep). Subgoal 3.1: Variables: SF SG PC IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelArgs SF SG PC nilArgs [] @ ============================ is_list is_slev []
< search. Subgoal 3.2: Variables: SF SG PC Rest L1 A1 E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsA : is_args (consArgs E A1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelArgs SF SG PC (consArgs E A1) (L1::Rest) @ Lev1 : level SF SG PC E L1 * Lev2 : levelArgs SF SG PC A1 Rest * ============================ is_list is_slev (L1::Rest)
< case IsA. Subgoal 3.2: Variables: SF SG PC Rest L1 A1 E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelArgs SF SG PC (consArgs E A1) (L1::Rest) @ Lev1 : level SF SG PC E L1 * Lev2 : levelArgs SF SG PC A1 Rest * H1 : is_expr E H2 : is_args A1 ============================ is_list is_slev (L1::Rest)
< apply IH_E to _ _ _ Lev1. Subgoal 3.2: Variables: SF SG PC Rest L1 A1 E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelArgs SF SG PC (consArgs E A1) (L1::Rest) @ Lev1 : level SF SG PC E L1 * Lev2 : levelArgs SF SG PC A1 Rest * H1 : is_expr E H2 : is_args A1 H3 : is_slev L1 ============================ is_list is_slev (L1::Rest)
< apply IH_A to _ _ _ Lev2. Subgoal 3.2: Variables: SF SG PC Rest L1 A1 E IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelArgs SF SG PC (consArgs E A1) (L1::Rest) @ Lev1 : level SF SG PC E L1 * Lev2 : levelArgs SF SG PC A1 Rest * H1 : is_expr E H2 : is_args A1 H3 : is_slev L1 H4 : is_list is_slev Rest ============================ is_list is_slev (L1::Rest)
< search. Subgoal 4: Variables: SF SG PC RF L IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelRecFields SF SG PC RF L @ ============================ is_slev L
< Lev: case Lev (keep). Subgoal 4.1: Variables: SF SG PC IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelRecFields SF SG PC nilRecFieldExprs public @ ============================ is_slev public
< search. Subgoal 4.2: Variables: SF SG PC L LE LRF RF1 E F IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsRF : is_recFieldExprs (consRecFieldExprs F E RF1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) L @ Lev1 : level SF SG PC E LE * Lev2 : levelRecFields SF SG PC RF1 LRF * Lev3 : join LE LRF L ============================ is_slev L
< case IsRF. Subgoal 4.2: Variables: SF SG PC L LE LRF RF1 E F IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) L @ Lev1 : level SF SG PC E LE * Lev2 : levelRecFields SF SG PC RF1 LRF * Lev3 : join LE LRF L H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 ============================ is_slev L
< apply IH_E to _ _ _ Lev1. Subgoal 4.2: Variables: SF SG PC L LE LRF RF1 E F IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) L @ Lev1 : level SF SG PC E LE * Lev2 : levelRecFields SF SG PC RF1 LRF * Lev3 : join LE LRF L H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : is_slev LE ============================ is_slev L
< apply IH_RF to _ _ _ Lev2. Subgoal 4.2: Variables: SF SG PC L LE LRF RF1 E F IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) L @ Lev1 : level SF SG PC E LE * Lev2 : levelRecFields SF SG PC RF1 LRF * Lev3 : join LE LRF L H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : is_slev LE H5 : is_slev LRF ============================ is_slev L
< apply join_is to _ _ Lev3. Subgoal 4.2: Variables: SF SG PC L LE LRF RF1 E F IH_E : forall SF SG PC E L, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> level SF SG PC E L * -> is_slev L IH_S : forall SF SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> secure SF SG PC S SG' * -> is_list (is_list (is_pair is_string is_slev)) SG' IH_A : forall SF SG PC A L, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelArgs SF SG PC A L * -> is_list is_slev L IH_RF : forall SF SG PC RF L, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> levelRecFields SF SG PC RF L * -> is_slev L IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG Lev : levelRecFields SF SG PC (consRecFieldExprs F E RF1) L @ Lev1 : level SF SG PC E LE * Lev2 : levelRecFields SF SG PC RF1 LRF * Lev3 : join LE LRF L H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 H4 : is_slev LE H5 : is_slev LRF H6 : is_slev L ============================ is_slev L
< search. Proof completed.
< Extensible_Theorem level_unique : forall SF SG PC E LA LB, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> LevA : level SF SG PC E LA -> LevB : level SF SG PC E LB -> LA = LB on LevA as IH_E, secure_unique : forall SF SG PC S SGA SGB, IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> SecA : secure SF SG PC S SGA -> SecB : secure SF SG PC S SGB -> SGA = SGB on SecA as IH_Salso levelArgs_unique : forall SF SG PC A LA LB, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> LevA : levelArgs SF SG PC A LA -> LevB : levelArgs SF SG PC A LB -> LA = LB on LevA as IH_A, levelRecFields_unique : forall SF SG PC RF LA LB, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> LevA : levelRecFields SF SG PC RF LA -> LevB : levelRecFields SF SG PC RF LB -> LA = LB on LevA as IH_RF. Subgoal 1.1: Variables: SF SG PC LB I IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (num I) public @ LevB : level SF SG PC (num I) LB ============================ public = LB
< case LevB. Subgoal 1.1: Variables: SF SG PC I IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (num I) public @ ============================ public = public
< search. Subgoal 1.2: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LA @ LevB : level SF SG PC (plus E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.2: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LA @ LevB : level SF SG PC (plus E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.2: Variables: SF SG PC LA LB L1 L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.2: Variables: SF SG PC LA LB L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.2: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.2: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA2. Subgoal 1.2: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 1.2: Variables: SF SG PC LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (plus E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.3: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LA @ LevB : level SF SG PC (minus E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.3: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LA @ LevB : level SF SG PC (minus E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.3: Variables: SF SG PC LA LB L1 L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.3: Variables: SF SG PC LA LB L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.3: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.3: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA2. Subgoal 1.3: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 1.3: Variables: SF SG PC LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (minus E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.4: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LA @ LevB : level SF SG PC (mult E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.4: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LA @ LevB : level SF SG PC (mult E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.4: Variables: SF SG PC LA LB L1 L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.4: Variables: SF SG PC LA LB L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.4: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.4: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA2. Subgoal 1.4: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 1.4: Variables: SF SG PC LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (mult E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.5: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LA @ LevB : level SF SG PC (div E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.5: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LA @ LevB : level SF SG PC (div E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.5: Variables: SF SG PC LA LB L1 L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.5: Variables: SF SG PC LA LB L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.5: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.5: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA2. Subgoal 1.5: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 1.5: Variables: SF SG PC LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (div E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.6: Variables: SF SG PC LB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC true public @ LevB : level SF SG PC true LB ============================ public = LB
< case LevB. Subgoal 1.6: Variables: SF SG PC IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC true public @ ============================ public = public
< search. Subgoal 1.7: Variables: SF SG PC LB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC false public @ LevB : level SF SG PC false LB ============================ public = LB
< case LevB. Subgoal 1.7: Variables: SF SG PC IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC false public @ ============================ public = public
< search. Subgoal 1.8: Variables: SF SG PC LA LB L1 Sl1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevB : level SF SG PC (and E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : join L1 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.8: Variables: SF SG PC LA LB L1 Sl1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevB : level SF SG PC (and E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : join L1 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.8: Variables: SF SG PC LA LB L1 Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : join L1 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.8: Variables: SF SG PC LA LB Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.8: Variables: SF SG PC LA LB Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevB. Subgoal 1.8: Variables: SF SG PC LA LB Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 ============================ LA = LB
< apply join_unique to _ _ LevA2 LevB1. Subgoal 1.8: Variables: SF SG PC LA LB L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 ============================ LA = LB
< apply join_is to _ _ LevA2. Subgoal 1.8: Variables: SF SG PC LA LB L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 ============================ LA = LB
< apply IH_E to _ _ _ _ LevA3 LevB2. Subgoal 1.8: Variables: SF SG PC LA LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.8: Variables: SF SG PC LA LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 H6 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA3. Subgoal 1.8: Variables: SF SG PC LA LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 H6 : is_slev L3 H7 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA4 LevB3. Subgoal 1.8: Variables: SF SG PC LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (and E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 H6 : is_slev L3 H7 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.9: Variables: SF SG PC LA LB L1 Sl1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevB : level SF SG PC (or E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : join L1 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.9: Variables: SF SG PC LA LB L1 Sl1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevB : level SF SG PC (or E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : join L1 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.9: Variables: SF SG PC LA LB L1 Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : join L1 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.9: Variables: SF SG PC LA LB Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.9: Variables: SF SG PC LA LB Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevB. Subgoal 1.9: Variables: SF SG PC LA LB Sl1 L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl1 LevA3 : level SF SG Sl1 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 ============================ LA = LB
< apply join_unique to _ _ LevA2 LevB1. Subgoal 1.9: Variables: SF SG PC LA LB L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 ============================ LA = LB
< apply join_is to _ _ LevA2. Subgoal 1.9: Variables: SF SG PC LA LB L2 E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L2 * LevA4 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 ============================ LA = LB
< apply IH_E to _ _ _ _ LevA3 LevB2. Subgoal 1.9: Variables: SF SG PC LA LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.9: Variables: SF SG PC LA LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 H6 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA3. Subgoal 1.9: Variables: SF SG PC LA LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 H6 : is_slev L3 H7 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA4 LevB3. Subgoal 1.9: Variables: SF SG PC LB E2 E1 L3 Sl2 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (or E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : join L3 PC Sl2 LevA3 : level SF SG Sl2 E2 L4 * LevA4 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : join L3 PC Sl2 LevB2 : level SF SG Sl2 E2 L4 LevB3 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L3 H5 : is_slev Sl2 H6 : is_slev L3 H7 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.10: Variables: SF SG PC LA LB E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (not E1) LA @ LevB : level SF SG PC (not E1) LB LevA1 : level SF SG PC E1 LA * ============================ LA = LB
< case IsE. Subgoal 1.10: Variables: SF SG PC LA LB E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (not E1) LA @ LevB : level SF SG PC (not E1) LB LevA1 : level SF SG PC E1 LA * H1 : is_expr E1 ============================ LA = LB
< LevB: case LevB. Subgoal 1.10: Variables: SF SG PC LA LB E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (not E1) LA @ LevA1 : level SF SG PC E1 LA * H1 : is_expr E1 LevB : level SF SG PC E1 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.10: Variables: SF SG PC LB E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (not E1) LB @ LevA1 : level SF SG PC E1 LB * H1 : is_expr E1 LevB : level SF SG PC E1 LB ============================ LB = LB
< search. Subgoal 1.11: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LA @ LevB : level SF SG PC (greater E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.11: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LA @ LevB : level SF SG PC (greater E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.11: Variables: SF SG PC LA LB L1 L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.11: Variables: SF SG PC LA LB L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.11: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.11: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA2. Subgoal 1.11: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 1.11: Variables: SF SG PC LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (greater E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.12: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LA @ LevB : level SF SG PC (eq E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.12: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LA @ LevB : level SF SG PC (eq E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.12: Variables: SF SG PC LA LB L1 L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.12: Variables: SF SG PC LA LB L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.12: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.12: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA2. Subgoal 1.12: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 1.12: Variables: SF SG PC LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (eq E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.13: Variables: SF SG PC LB S IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stringLit S) public @ LevB : level SF SG PC (stringLit S) LB ============================ public = LB
< case LevB. Subgoal 1.13: Variables: SF SG PC S IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stringLit S) public @ ============================ public = public
< search. Subgoal 1.14: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LA @ LevB : level SF SG PC (appString E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA ============================ LA = LB
< case IsE. Subgoal 1.14: Variables: SF SG PC LA LB L1 L2 E2 E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LA @ LevB : level SF SG PC (appString E1 E2) LB LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 ============================ LA = LB
< LevB: case LevB. Subgoal 1.14: Variables: SF SG PC LA LB L1 L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LA @ LevA1 : level SF SG PC E1 L1 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L1 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.14: Variables: SF SG PC LA LB L2 E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L2 * LevA3 : join L3 L2 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.14: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 1.14: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 ============================ LA = LB
< apply level_is to _ _ _ LevA2. Subgoal 1.14: Variables: SF SG PC LA LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LA @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LA H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 1.14: Variables: SF SG PC LB E2 E1 L3 L4 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (appString E1 E2) LB @ LevA1 : level SF SG PC E1 L3 * LevA2 : level SF SG PC E2 L4 * LevA3 : join L3 L4 LB H1 : is_expr E1 H2 : is_expr E2 LevB : level SF SG PC E1 L3 LevB1 : level SF SG PC E2 L4 LevB2 : join L3 L4 LB H3 : is_slev L3 H4 : is_slev L4 ============================ LB = LB
< search. Subgoal 1.15: Variables: SF SG PC LA LB X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (name X) LA @ LevB : level SF SG PC (name X) LB LevA1 : lookupScopes X SG LA ============================ LA = LB
< case IsE. Subgoal 1.15: Variables: SF SG PC LA LB X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (name X) LA @ LevB : level SF SG PC (name X) LB LevA1 : lookupScopes X SG LA H1 : is_string X ============================ LA = LB
< LevB: case LevB. Subgoal 1.15: Variables: SF SG PC LA LB X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (name X) LA @ LevA1 : lookupScopes X SG LA H1 : is_string X LevB : lookupScopes X SG LB ============================ LA = LB
< apply lookupScopes_unique to LevA1 LevB. Subgoal 1.15: Variables: SF SG PC LB X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (name X) LB @ LevA1 : lookupScopes X SG LB H1 : is_string X LevB : lookupScopes X SG LB ============================ LB = LB
< search. Subgoal 1.16: Variables: SF SG LB ArgLevs Args Fun IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private LevA : level SF SG private (call Fun Args) private @ LevB : level SF SG private (call Fun Args) LB LevA1 : lookup SF Fun (private, ArgLevs) LevA2 : levelArgs SF SG private Args ArgLevs * ============================ private = LB
< case IsE. Subgoal 1.16: Variables: SF SG LB ArgLevs Args Fun IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private LevA : level SF SG private (call Fun Args) private @ LevB : level SF SG private (call Fun Args) LB LevA1 : lookup SF Fun (private, ArgLevs) LevA2 : levelArgs SF SG private Args ArgLevs * H1 : is_string Fun H2 : is_args Args ============================ private = LB
< LevB: case LevB. Subgoal 1.16: Variables: SF SG ArgLevs Args Fun ArgLevs1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private LevA : level SF SG private (call Fun Args) private @ LevA1 : lookup SF Fun (private, ArgLevs) LevA2 : levelArgs SF SG private Args ArgLevs * H1 : is_string Fun H2 : is_args Args LevB : lookup SF Fun (private, ArgLevs1) LevB1 : levelArgs SF SG private Args ArgLevs1 ============================ private = private
< apply lookup_unique to LevA1 LevB. Subgoal 1.16: Variables: SF SG Args Fun ArgLevs1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private LevA : level SF SG private (call Fun Args) private @ LevA1 : lookup SF Fun (private, ArgLevs1) LevA2 : levelArgs SF SG private Args ArgLevs1 * H1 : is_string Fun H2 : is_args Args LevB : lookup SF Fun (private, ArgLevs1) LevB1 : levelArgs SF SG private Args ArgLevs1 ============================ private = private
< search. Subgoal 1.17: Variables: SF SG LA LB ArgLevs Args Fun IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public LevA : level SF SG public (call Fun Args) LA @ LevB : level SF SG public (call Fun Args) LB LevA1 : lookup SF Fun (LA, ArgLevs) LevA2 : levelArgs SF SG public Args ArgLevs * ============================ LA = LB
< case IsE. Subgoal 1.17: Variables: SF SG LA LB ArgLevs Args Fun IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public LevA : level SF SG public (call Fun Args) LA @ LevB : level SF SG public (call Fun Args) LB LevA1 : lookup SF Fun (LA, ArgLevs) LevA2 : levelArgs SF SG public Args ArgLevs * H1 : is_string Fun H2 : is_args Args ============================ LA = LB
< LevB: case LevB. Subgoal 1.17: Variables: SF SG LA LB ArgLevs Args Fun ArgLevs1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public LevA : level SF SG public (call Fun Args) LA @ LevA1 : lookup SF Fun (LA, ArgLevs) LevA2 : levelArgs SF SG public Args ArgLevs * H1 : is_string Fun H2 : is_args Args LevB : lookup SF Fun (LB, ArgLevs1) LevB1 : levelArgs SF SG public Args ArgLevs1 ============================ LA = LB
< apply lookup_unique to LevA1 LevB. Subgoal 1.17: Variables: SF SG LB Args Fun ArgLevs1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public LevA : level SF SG public (call Fun Args) LB @ LevA1 : lookup SF Fun (LB, ArgLevs1) LevA2 : levelArgs SF SG public Args ArgLevs1 * H1 : is_string Fun H2 : is_args Args LevB : lookup SF Fun (LB, ArgLevs1) LevB1 : levelArgs SF SG public Args ArgLevs1 ============================ LB = LB
< search. Subgoal 1.18: Variables: SF SG PC LA LB SG2 E1 S IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stmtExpr S E1) LA @ LevB : level SF SG PC (stmtExpr S E1) LB LevA1 : secure SF ([]::SG) PC S SG2 * LevA2 : level SF SG2 PC E1 LA * ============================ LA = LB
< case IsE. Subgoal 1.18: Variables: SF SG PC LA LB SG2 E1 S IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stmtExpr S E1) LA @ LevB : level SF SG PC (stmtExpr S E1) LB LevA1 : secure SF ([]::SG) PC S SG2 * LevA2 : level SF SG2 PC E1 LA * H1 : is_stmt S H2 : is_expr E1 ============================ LA = LB
< LevB: case LevB. Subgoal 1.18: Variables: SF SG PC LA LB SG2 E1 S SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stmtExpr S E1) LA @ LevA1 : secure SF ([]::SG) PC S SG2 * LevA2 : level SF SG2 PC E1 LA * H1 : is_stmt S H2 : is_expr E1 LevB : secure SF ([]::SG) PC S SG1 LevB1 : level SF SG1 PC E1 LB ============================ LA = LB
< apply IH_S to _ _ _ _ LevA1 LevB. Subgoal 1.18: Variables: SF SG PC LA LB E1 S SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stmtExpr S E1) LA @ LevA1 : secure SF ([]::SG) PC S SG1 * LevA2 : level SF SG1 PC E1 LA * H1 : is_stmt S H2 : is_expr E1 LevB : secure SF ([]::SG) PC S SG1 LevB1 : level SF SG1 PC E1 LB ============================ LA = LB
< apply secure_is to _ _ _ LevA1. Subgoal 1.18: Variables: SF SG PC LA LB E1 S SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stmtExpr S E1) LA @ LevA1 : secure SF ([]::SG) PC S SG1 * LevA2 : level SF SG1 PC E1 LA * H1 : is_stmt S H2 : is_expr E1 LevB : secure SF ([]::SG) PC S SG1 LevB1 : level SF SG1 PC E1 LB H3 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ LA = LB
< apply IH_E to _ _ _ _ LevA2 LevB1. Subgoal 1.18: Variables: SF SG PC LB E1 S SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (stmtExpr S E1) LB @ LevA1 : secure SF ([]::SG) PC S SG1 * LevA2 : level SF SG1 PC E1 LB * H1 : is_stmt S H2 : is_expr E1 LevB : secure SF ([]::SG) PC S SG1 LevB1 : level SF SG1 PC E1 LB H3 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ LB = LB
< search. Subgoal 1.19: Variables: SF SG PC LA LB Fields IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (recBuild Fields) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recBuild Fields) LA @ LevB : level SF SG PC (recBuild Fields) LB LevA1 : levelRecFields SF SG PC Fields LA * ============================ LA = LB
< case IsE. Subgoal 1.19: Variables: SF SG PC LA LB Fields IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recBuild Fields) LA @ LevB : level SF SG PC (recBuild Fields) LB LevA1 : levelRecFields SF SG PC Fields LA * H1 : is_recFieldExprs Fields ============================ LA = LB
< LevB: case LevB. Subgoal 1.19: Variables: SF SG PC LA LB Fields IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recBuild Fields) LA @ LevA1 : levelRecFields SF SG PC Fields LA * H1 : is_recFieldExprs Fields LevB : levelRecFields SF SG PC Fields LB ============================ LA = LB
< apply IH_RF to _ _ _ _ LevA1 LevB. Subgoal 1.19: Variables: SF SG PC LB Fields IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recBuild Fields) LB @ LevA1 : levelRecFields SF SG PC Fields LB * H1 : is_recFieldExprs Fields LevB : levelRecFields SF SG PC Fields LB ============================ LB = LB
< search. Subgoal 1.20: Variables: SF SG PC LA LB Field E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (recFieldAccess E1 Field) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recFieldAccess E1 Field) LA @ LevB : level SF SG PC (recFieldAccess E1 Field) LB LevA1 : level SF SG PC E1 LA * ============================ LA = LB
< case IsE. Subgoal 1.20: Variables: SF SG PC LA LB Field E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recFieldAccess E1 Field) LA @ LevB : level SF SG PC (recFieldAccess E1 Field) LB LevA1 : level SF SG PC E1 LA * H1 : is_expr E1 H2 : is_string Field ============================ LA = LB
< LevB: case LevB. Subgoal 1.20: Variables: SF SG PC LA LB Field E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recFieldAccess E1 Field) LA @ LevA1 : level SF SG PC E1 LA * H1 : is_expr E1 H2 : is_string Field LevB : level SF SG PC E1 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.20: Variables: SF SG PC LB Field E1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (recFieldAccess E1 Field) LB @ LevA1 : level SF SG PC E1 LB * H1 : is_expr E1 H2 : is_string Field LevB : level SF SG PC E1 LB ============================ LB = LB
< search. Subgoal 1.21: Variables: SF SG PC LA LB Ty Msg IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr (errorExpr Msg Ty) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (errorExpr Msg Ty) LA @ LevB : level SF SG PC (errorExpr Msg Ty) LB LevA1 : level SF SG PC Msg LA * ============================ LA = LB
< case IsE. Subgoal 1.21: Variables: SF SG PC LA LB Ty Msg IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (errorExpr Msg Ty) LA @ LevB : level SF SG PC (errorExpr Msg Ty) LB LevA1 : level SF SG PC Msg LA * H1 : is_expr Msg H2 : is_typ Ty ============================ LA = LB
< LevB: case LevB. Subgoal 1.21: Variables: SF SG PC LA LB Ty Msg IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (errorExpr Msg Ty) LA @ LevA1 : level SF SG PC Msg LA * H1 : is_expr Msg H2 : is_typ Ty LevB : level SF SG PC Msg LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 1.21: Variables: SF SG PC LB Ty Msg IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC (errorExpr Msg Ty) LB @ LevA1 : level SF SG PC Msg LB * H1 : is_expr Msg H2 : is_typ Ty LevB : level SF SG PC Msg LB ============================ LB = LB
< search. Subgoal 1.22: Variables: SF SG PC LA LB Names E_P IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC <unknown I expr> LA @ LevB : level SF SG PC <unknown I expr> LB LevA1 : names SG Names LevA2 : Names |{expr}- <unknown I expr> ~~> E_P LevA3 : level SF SG PC E_P LA * ============================ LA = LB
< apply names_is_sec to _ LevA1. Subgoal 1.22: Variables: SF SG PC LA LB Names E_P IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC <unknown I expr> LA @ LevB : level SF SG PC <unknown I expr> LB LevA1 : names SG Names LevA2 : Names |{expr}- <unknown I expr> ~~> E_P LevA3 : level SF SG PC E_P LA * H1 : is_list is_string Names ============================ LA = LB
< apply proj_expr_is to LevA2 _ _. Subgoal 1.22: Variables: SF SG PC LA LB Names E_P IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC <unknown I expr> LA @ LevB : level SF SG PC <unknown I expr> LB LevA1 : names SG Names LevA2 : Names |{expr}- <unknown I expr> ~~> E_P LevA3 : level SF SG PC E_P LA * H1 : is_list is_string Names H2 : is_expr E_P ============================ LA = LB
< LevB: case LevB. Subgoal 1.22: Variables: SF SG PC LA LB Names E_P Names1 E_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC <unknown I expr> LA @ LevA1 : names SG Names LevA2 : Names |{expr}- <unknown I expr> ~~> E_P LevA3 : level SF SG PC E_P LA * H1 : is_list is_string Names H2 : is_expr E_P LevB : names SG Names1 LevB1 : Names1 |{expr}- <unknown I expr> ~~> E_P1 LevB2 : level SF SG PC E_P1 LB ============================ LA = LB
< apply names_unique to LevA1 LevB. Subgoal 1.22: Variables: SF SG PC LA LB E_P Names1 E_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC <unknown I expr> LA @ LevA1 : names SG Names1 LevA2 : Names1 |{expr}- <unknown I expr> ~~> E_P LevA3 : level SF SG PC E_P LA * H1 : is_list is_string Names1 H2 : is_expr E_P LevB : names SG Names1 LevB1 : Names1 |{expr}- <unknown I expr> ~~> E_P1 LevB2 : level SF SG PC E_P1 LB ============================ LA = LB
< apply proj_expr_unique to LevA2 LevB1 _ _ _ _ _. Subgoal 1.22: Variables: SF SG PC LA LB Names1 E_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC <unknown I expr> LA @ LevA1 : names SG Names1 LevA2 : Names1 |{expr}- <unknown I expr> ~~> E_P1 LevA3 : level SF SG PC E_P1 LA * H1 : is_list is_string Names1 H2 : is_expr E_P1 LevB : names SG Names1 LevB1 : Names1 |{expr}- <unknown I expr> ~~> E_P1 LevB2 : level SF SG PC E_P1 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA3 LevB2. Subgoal 1.22: Variables: SF SG PC LB Names1 E_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsE : is_expr <unknown I expr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : level SF SG PC <unknown I expr> LB @ LevA1 : names SG Names1 LevA2 : Names1 |{expr}- <unknown I expr> ~~> E_P1 LevA3 : level SF SG PC E_P1 LB * H1 : is_list is_string Names1 H2 : is_expr E_P1 LevB : names SG Names1 LevB1 : Names1 |{expr}- <unknown I expr> ~~> E_P1 LevB2 : level SF SG PC E_P1 LB ============================ LB = LB
< search. Subgoal 2.1: Variables: SF PC SGA SGB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev PC SecA : secure SF SGA PC noop SGA @ SecB : secure SF SGA PC noop SGB ============================ SGA = SGB
< case SecB. Subgoal 2.1: Variables: SF PC SGB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev PC SecA : secure SF SGB PC noop SGB @ ============================ SGB = SGB
< search. Subgoal 2.2: Variables: SF SG PC SGA SGB SG3 S2 S1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC (seq S1 S2) SGA @ SecB : secure SF SG PC (seq S1 S2) SGB SecA1 : secure SF SG PC S1 SG3 * SecA2 : secure SF SG3 PC S2 SGA * ============================ SGA = SGB
< case IsS. Subgoal 2.2: Variables: SF SG PC SGA SGB SG3 S2 S1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC (seq S1 S2) SGA @ SecB : secure SF SG PC (seq S1 S2) SGB SecA1 : secure SF SG PC S1 SG3 * SecA2 : secure SF SG3 PC S2 SGA * H1 : is_stmt S1 H2 : is_stmt S2 ============================ SGA = SGB
< SecB: case SecB. Subgoal 2.2: Variables: SF SG PC SGA SGB SG3 S2 S1 SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC (seq S1 S2) SGA @ SecA1 : secure SF SG PC S1 SG3 * SecA2 : secure SF SG3 PC S2 SGA * H1 : is_stmt S1 H2 : is_stmt S2 SecB : secure SF SG PC S1 SG1 SecB1 : secure SF SG1 PC S2 SGB ============================ SGA = SGB
< apply IH_S to _ _ _ _ SecA1 SecB. Subgoal 2.2: Variables: SF SG PC SGA SGB S2 S1 SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC (seq S1 S2) SGA @ SecA1 : secure SF SG PC S1 SG1 * SecA2 : secure SF SG1 PC S2 SGA * H1 : is_stmt S1 H2 : is_stmt S2 SecB : secure SF SG PC S1 SG1 SecB1 : secure SF SG1 PC S2 SGB ============================ SGA = SGB
< apply secure_is to _ _ _ SecA1. Subgoal 2.2: Variables: SF SG PC SGA SGB S2 S1 SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC (seq S1 S2) SGA @ SecA1 : secure SF SG PC S1 SG1 * SecA2 : secure SF SG1 PC S2 SGA * H1 : is_stmt S1 H2 : is_stmt S2 SecB : secure SF SG PC S1 SG1 SecB1 : secure SF SG1 PC S2 SGB H3 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ SGA = SGB
< apply secure_is to _ _ _ SecB. Subgoal 2.2: Variables: SF SG PC SGA SGB S2 S1 SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC (seq S1 S2) SGA @ SecA1 : secure SF SG PC S1 SG1 * SecA2 : secure SF SG1 PC S2 SGA * H1 : is_stmt S1 H2 : is_stmt S2 SecB : secure SF SG PC S1 SG1 SecB1 : secure SF SG1 PC S2 SGB H3 : is_list (is_list (is_pair is_string is_slev)) SG1 H4 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ SGA = SGB
< apply IH_S to _ _ _ _ SecA2 SecB1. Subgoal 2.2: Variables: SF SG PC SGB S2 S1 SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC (seq S1 S2) SGB @ SecA1 : secure SF SG PC S1 SG1 * SecA2 : secure SF SG1 PC S2 SGB * H1 : is_stmt S1 H2 : is_stmt S2 SecB : secure SF SG PC S1 SG1 SecB1 : secure SF SG1 PC S2 SGB H3 : is_list (is_list (is_pair is_string is_slev)) SG1 H4 : is_list (is_list (is_pair is_string is_slev)) SG1 ============================ SGB = SGB
< search. Subgoal 2.3: Variables: SF SGB SG1 Scope X E Ty IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) IsPC : is_slev public SecA : secure SF (Scope::SG1) public (declare Ty X E) (((X, public)::Scope)::SG1) @ SecB : secure SF (Scope::SG1) public (declare Ty X E) SGB SecA1 : level SF (Scope::SG1) public E public * SecA2 : no_lookup Scope X ============================ ((X, public)::Scope)::SG1 = SGB
< case IsS. Subgoal 2.3: Variables: SF SGB SG1 Scope X E Ty IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) IsPC : is_slev public SecA : secure SF (Scope::SG1) public (declare Ty X E) (((X, public)::Scope)::SG1) @ SecB : secure SF (Scope::SG1) public (declare Ty X E) SGB SecA1 : level SF (Scope::SG1) public E public * SecA2 : no_lookup Scope X H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ ((X, public)::Scope)::SG1 = SGB
< SecB: case SecB. Subgoal 2.3: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) IsPC : is_slev public SecA : secure SF (Scope::SG1) public (declare Ty X E) (((X, public)::Scope)::SG1) @ SecA1 : level SF (Scope::SG1) public E public * SecA2 : no_lookup Scope X H1 : is_typ Ty H2 : is_string X H3 : is_expr E SecB : level SF (Scope::SG1) public E public SecB1 : no_lookup Scope X ============================ ((X, public)::Scope)::SG1 = ((X, public)::Scope)::SG1
< search. Subgoal 2.4: Variables: SF PC SGA SGB L E X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev PC SecA : secure SF SGA PC (assign X E) SGA @ SecB : secure SF SGA PC (assign X E) SGB SecA1 : level SF SGA PC E L * SecA2 : lookupScopes X SGA private ============================ SGA = SGB
< case IsS. Subgoal 2.4: Variables: SF PC SGA SGB L E X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev PC SecA : secure SF SGA PC (assign X E) SGA @ SecB : secure SF SGA PC (assign X E) SGB SecA1 : level SF SGA PC E L * SecA2 : lookupScopes X SGA private H1 : is_string X H2 : is_expr E ============================ SGA = SGB
< SecB: case SecB. Subgoal 2.4.1: Variables: SF PC SGB L E X L1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev PC SecA : secure SF SGB PC (assign X E) SGB @ SecA1 : level SF SGB PC E L * SecA2 : lookupScopes X SGB private H1 : is_string X H2 : is_expr E SecB : level SF SGB PC E L1 SecB1 : lookupScopes X SGB private ============================ SGB = SGB
< search. Subgoal 2.4.2: Variables: SF SGB L E X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (assign X E) SGB @ SecA1 : level SF SGB public E L * SecA2 : lookupScopes X SGB private H1 : is_string X H2 : is_expr E SecB : level SF SGB public E public SecB1 : lookupScopes X SGB public ============================ SGB = SGB
< search. Subgoal 2.5: Variables: SF SGA SGB E X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev public SecA : secure SF SGA public (assign X E) SGA @ SecB : secure SF SGA public (assign X E) SGB SecA1 : level SF SGA public E public * SecA2 : lookupScopes X SGA public ============================ SGA = SGB
< case SecB. Subgoal 2.5.1: Variables: SF SGB E X L IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (assign X E) SGB @ SecA1 : level SF SGB public E public * SecA2 : lookupScopes X SGB public H1 : level SF SGB public E L H2 : lookupScopes X SGB private ============================ SGB = SGB
< search. Subgoal 2.5.2: Variables: SF SGB E X IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (assign X E) SGB @ SecA1 : level SF SGB public E public * SecA2 : lookupScopes X SGB public H1 : level SF SGB public E public H2 : lookupScopes X SGB public ============================ SGB = SGB
< search. Subgoal 2.6: Variables: SF PC SGA SGB L E Fields Rec IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev PC SecA : secure SF SGA PC (recUpdate Rec Fields E) SGA @ SecB : secure SF SGA PC (recUpdate Rec Fields E) SGB SecA1 : level SF SGA PC E L * SecA2 : lookupScopes Rec SGA private ============================ SGA = SGB
< case SecB. Subgoal 2.6.1: Variables: SF PC SGB L E Fields Rec L1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev PC SecA : secure SF SGB PC (recUpdate Rec Fields E) SGB @ SecA1 : level SF SGB PC E L * SecA2 : lookupScopes Rec SGB private H1 : level SF SGB PC E L1 H2 : lookupScopes Rec SGB private ============================ SGB = SGB
< search. Subgoal 2.6.2: Variables: SF SGB L E Fields Rec IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (recUpdate Rec Fields E) SGB @ SecA1 : level SF SGB public E L * SecA2 : lookupScopes Rec SGB private H1 : level SF SGB public E public H2 : lookupScopes Rec SGB public ============================ SGB = SGB
< search. Subgoal 2.7: Variables: SF SGA SGB E Fields Rec IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev public SecA : secure SF SGA public (recUpdate Rec Fields E) SGA @ SecB : secure SF SGA public (recUpdate Rec Fields E) SGB SecA1 : level SF SGA public E public * SecA2 : lookupScopes Rec SGA public ============================ SGA = SGB
< case SecB. Subgoal 2.7.1: Variables: SF SGB E Fields Rec L IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (recUpdate Rec Fields E) SGB @ SecA1 : level SF SGB public E public * SecA2 : lookupScopes Rec SGB public H1 : level SF SGB public E L H2 : lookupScopes Rec SGB private ============================ SGB = SGB
< search. Subgoal 2.7.2: Variables: SF SGB E Fields Rec IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (recUpdate Rec Fields E) SGB @ SecA1 : level SF SGB public E public * SecA2 : lookupScopes Rec SGB public H1 : level SF SGB public E public H2 : lookupScopes Rec SGB public ============================ SGB = SGB
< search. Subgoal 2.8: Variables: SF PC SGA SGB L Sl1 SGT SGF F T E IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (ifThenElse E T F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev PC SecA : secure SF SGA PC (ifThenElse E T F) SGA @ SecB : secure SF SGA PC (ifThenElse E T F) SGB SecA1 : level SF SGA PC E L * SecA2 : join L PC Sl1 SecA3 : secure SF ([]::SGA) Sl1 T SGT * SecA4 : secure SF ([]::SGA) Sl1 F SGF * ============================ SGA = SGB
< case SecB. Subgoal 2.8: Variables: SF PC SGB L Sl1 SGT SGF F T E L1 Sl2 SGT1 SGF1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (ifThenElse E T F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev PC SecA : secure SF SGB PC (ifThenElse E T F) SGB @ SecA1 : level SF SGB PC E L * SecA2 : join L PC Sl1 SecA3 : secure SF ([]::SGB) Sl1 T SGT * SecA4 : secure SF ([]::SGB) Sl1 F SGF * H1 : level SF SGB PC E L1 H2 : join L1 PC Sl2 H3 : secure SF ([]::SGB) Sl2 T SGT1 H4 : secure SF ([]::SGB) Sl2 F SGF1 ============================ SGB = SGB
< search. Subgoal 2.9: Variables: SF SGA SGB L Scope SG2 S1 E IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev private SecA : secure SF SGA private (while E S1) SGA @ SecB : secure SF SGA private (while E S1) SGB SecA1 : level SF SGA private E L * SecA2 : secure SF ([]::SGA) private S1 (Scope::SG2) * ============================ SGA = SGB
< case SecB. Subgoal 2.9: Variables: SF SGB L Scope SG2 S1 E L1 Scope1 SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev private SecA : secure SF SGB private (while E S1) SGB @ SecA1 : level SF SGB private E L * SecA2 : secure SF ([]::SGB) private S1 (Scope::SG2) * H1 : level SF SGB private E L1 H2 : secure SF ([]::SGB) private S1 (Scope1::SG1) ============================ SGB = SGB
< search. Subgoal 2.10: Variables: SF SGA SGB Scope SG2 S1 E IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev public SecA : secure SF SGA public (while E S1) SGA @ SecB : secure SF SGA public (while E S1) SGB SecA1 : level SF SGA public E public * SecA2 : secure SF ([]::SGA) public S1 (Scope::SG2) * ============================ SGA = SGB
< case SecB. Subgoal 2.10: Variables: SF SGB Scope SG2 S1 E Scope1 SG1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (while E S1) SGB @ SecA1 : level SF SGB public E public * SecA2 : secure SF ([]::SGB) public S1 (Scope::SG2) * H1 : level SF SGB public E public H2 : secure SF ([]::SGB) public S1 (Scope1::SG1) ============================ SGB = SGB
< search. Subgoal 2.11: Variables: SF PC SGA SGB Scope S1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev PC SecA : secure SF SGA PC (scopeStmt S1) SGA @ SecB : secure SF SGA PC (scopeStmt S1) SGB SecA1 : secure SF ([]::SGA) PC S1 (Scope::SGA) * ============================ SGA = SGB
< case SecB. Subgoal 2.11: Variables: SF PC SGB Scope S1 Scope1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev PC SecA : secure SF SGB PC (scopeStmt S1) SGB @ SecA1 : secure SF ([]::SGB) PC S1 (Scope::SGB) * H1 : secure SF ([]::SGB) PC S1 (Scope1::SGB) ============================ SGB = SGB
< search. Subgoal 2.12: Variables: SF SGA SGB E IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGA IsPC : is_slev public SecA : secure SF SGA public (printVal E) SGA @ SecB : secure SF SGA public (printVal E) SGB SecA1 : level SF SGA public E public * ============================ SGA = SGB
< case SecB. Subgoal 2.12: Variables: SF SGB E IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SGB IsPC : is_slev public SecA : secure SF SGB public (printVal E) SGB @ SecA1 : level SF SGB public E public * H1 : level SF SGB public E public ============================ SGB = SGB
< search. Subgoal 2.13: Variables: SF PC SGB L SG1 Scope X E Ty IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) IsPC : is_slev PC SecA : secure SF (Scope::SG1) PC (secdecl private Ty X E) (((X, private)::Scope)::SG1) @ SecB : secure SF (Scope::SG1) PC (secdecl private Ty X E) SGB SecA1 : level SF (Scope::SG1) PC E L * SecA2 : no_lookup Scope X ============================ ((X, private)::Scope)::SG1 = SGB
< case SecB. Subgoal 2.13: Variables: SF PC L SG1 Scope X E Ty L1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) IsPC : is_slev PC SecA : secure SF (Scope::SG1) PC (secdecl private Ty X E) (((X, private)::Scope)::SG1) @ SecA1 : level SF (Scope::SG1) PC E L * SecA2 : no_lookup Scope X H1 : level SF (Scope::SG1) PC E L1 H2 : no_lookup Scope X ============================ ((X, private)::Scope)::SG1 = ((X, private)::Scope)::SG1
< search. Subgoal 2.14: Variables: SF SGB SG1 Scope X E Ty IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) IsPC : is_slev public SecA : secure SF (Scope::SG1) public (secdecl public Ty X E) (((X, public)::Scope)::SG1) @ SecB : secure SF (Scope::SG1) public (secdecl public Ty X E) SGB SecA1 : level SF (Scope::SG1) public E public * SecA2 : no_lookup Scope X ============================ ((X, public)::Scope)::SG1 = SGB
< case SecB. Subgoal 2.14: Variables: SF SG1 Scope X E Ty IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG1) IsPC : is_slev public SecA : secure SF (Scope::SG1) public (secdecl public Ty X E) (((X, public)::Scope)::SG1) @ SecA1 : level SF (Scope::SG1) public E public * SecA2 : no_lookup Scope X H1 : level SF (Scope::SG1) public E public H2 : no_lookup Scope X ============================ ((X, public)::Scope)::SG1 = ((X, public)::Scope)::SG1
< search. Subgoal 2.15: Variables: SF SG PC SGA SGB Names S_P IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC <unknown I stmt> SGA @ SecB : secure SF SG PC <unknown I stmt> SGB SecA1 : names SG Names SecA2 : Names |{stmt}- <unknown I stmt> ~~> S_P SecA3 : secure SF SG PC S_P SGA * ============================ SGA = SGB
< SecB: case SecB. Subgoal 2.15: Variables: SF SG PC SGA SGB Names S_P Names1 S_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC <unknown I stmt> SGA @ SecA1 : names SG Names SecA2 : Names |{stmt}- <unknown I stmt> ~~> S_P SecA3 : secure SF SG PC S_P SGA * SecB : names SG Names1 SecB1 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecB2 : secure SF SG PC S_P1 SGB ============================ SGA = SGB
< apply names_is_sec to _ SecA1. Subgoal 2.15: Variables: SF SG PC SGA SGB Names S_P Names1 S_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC <unknown I stmt> SGA @ SecA1 : names SG Names SecA2 : Names |{stmt}- <unknown I stmt> ~~> S_P SecA3 : secure SF SG PC S_P SGA * SecB : names SG Names1 SecB1 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecB2 : secure SF SG PC S_P1 SGB H1 : is_list is_string Names ============================ SGA = SGB
< apply proj_stmt_is to SecA2 _ _. Subgoal 2.15: Variables: SF SG PC SGA SGB Names S_P Names1 S_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC <unknown I stmt> SGA @ SecA1 : names SG Names SecA2 : Names |{stmt}- <unknown I stmt> ~~> S_P SecA3 : secure SF SG PC S_P SGA * SecB : names SG Names1 SecB1 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecB2 : secure SF SG PC S_P1 SGB H1 : is_list is_string Names H2 : is_stmt S_P ============================ SGA = SGB
< apply names_unique to SecA1 SecB. Subgoal 2.15: Variables: SF SG PC SGA SGB S_P Names1 S_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC <unknown I stmt> SGA @ SecA1 : names SG Names1 SecA2 : Names1 |{stmt}- <unknown I stmt> ~~> S_P SecA3 : secure SF SG PC S_P SGA * SecB : names SG Names1 SecB1 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecB2 : secure SF SG PC S_P1 SGB H1 : is_list is_string Names1 H2 : is_stmt S_P ============================ SGA = SGB
< apply proj_stmt_unique to SecA2 SecB1 _ _ _ _ _. Subgoal 2.15: Variables: SF SG PC SGA SGB Names1 S_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC <unknown I stmt> SGA @ SecA1 : names SG Names1 SecA2 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecA3 : secure SF SG PC S_P1 SGA * SecB : names SG Names1 SecB1 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecB2 : secure SF SG PC S_P1 SGB H1 : is_list is_string Names1 H2 : is_stmt S_P1 ============================ SGA = SGB
< apply IH_S to _ _ _ _ SecA3 SecB2. Subgoal 2.15: Variables: SF SG PC SGB Names1 S_P1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC SecA : secure SF SG PC <unknown I stmt> SGB @ SecA1 : names SG Names1 SecA2 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecA3 : secure SF SG PC S_P1 SGB * SecB : names SG Names1 SecB1 : Names1 |{stmt}- <unknown I stmt> ~~> S_P1 SecB2 : secure SF SG PC S_P1 SGB H1 : is_list is_string Names1 H2 : is_stmt S_P1 ============================ SGB = SGB
< search. Subgoal 3: Variables: SF SG PC A LA LB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC A LA @ LevB : levelArgs SF SG PC A LB ============================ LA = LB
< LevA: case LevA (keep). Subgoal 3.1: Variables: SF SG PC LB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC nilArgs [] @ LevB : levelArgs SF SG PC nilArgs LB ============================ [] = LB
< case LevB. Subgoal 3.1: Variables: SF SG PC IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC nilArgs [] @ ============================ [] = []
< search. Subgoal 3.2: Variables: SF SG PC LB Rest L A1 E IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsA : is_args (consArgs E A1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC (consArgs E A1) (L::Rest) @ LevB : levelArgs SF SG PC (consArgs E A1) LB LevA1 : level SF SG PC E L * LevA2 : levelArgs SF SG PC A1 Rest * ============================ L::Rest = LB
< case IsA. Subgoal 3.2: Variables: SF SG PC LB Rest L A1 E IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC (consArgs E A1) (L::Rest) @ LevB : levelArgs SF SG PC (consArgs E A1) LB LevA1 : level SF SG PC E L * LevA2 : levelArgs SF SG PC A1 Rest * H1 : is_expr E H2 : is_args A1 ============================ L::Rest = LB
< LevB: case LevB. Subgoal 3.2: Variables: SF SG PC Rest L A1 E Rest1 L1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC (consArgs E A1) (L::Rest) @ LevA1 : level SF SG PC E L * LevA2 : levelArgs SF SG PC A1 Rest * H1 : is_expr E H2 : is_args A1 LevB : level SF SG PC E L1 LevB1 : levelArgs SF SG PC A1 Rest1 ============================ L::Rest = L1::Rest1
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 3.2: Variables: SF SG PC Rest A1 E Rest1 L1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC (consArgs E A1) (L1::Rest) @ LevA1 : level SF SG PC E L1 * LevA2 : levelArgs SF SG PC A1 Rest * H1 : is_expr E H2 : is_args A1 LevB : level SF SG PC E L1 LevB1 : levelArgs SF SG PC A1 Rest1 ============================ L1::Rest = L1::Rest1
< apply IH_A to _ _ _ _ LevA2 LevB1. Subgoal 3.2: Variables: SF SG PC A1 E Rest1 L1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelArgs SF SG PC (consArgs E A1) (L1::Rest1) @ LevA1 : level SF SG PC E L1 * LevA2 : levelArgs SF SG PC A1 Rest1 * H1 : is_expr E H2 : is_args A1 LevB : level SF SG PC E L1 LevB1 : levelArgs SF SG PC A1 Rest1 ============================ L1::Rest1 = L1::Rest1
< search. Subgoal 4: Variables: SF SG PC RF LA LB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC RF LA @ LevB : levelRecFields SF SG PC RF LB ============================ LA = LB
< LevA: case LevA (keep). Subgoal 4.1: Variables: SF SG PC LB IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC nilRecFieldExprs public @ LevB : levelRecFields SF SG PC nilRecFieldExprs LB ============================ public = LB
< case LevB. Subgoal 4.1: Variables: SF SG PC IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC nilRecFieldExprs public @ ============================ public = public
< search. Subgoal 4.2: Variables: SF SG PC LA LB LE LRF RF1 E F IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsRF : is_recFieldExprs (consRecFieldExprs F E RF1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LA @ LevB : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LB LevA1 : level SF SG PC E LE * LevA2 : levelRecFields SF SG PC RF1 LRF * LevA3 : join LE LRF LA ============================ LA = LB
< case IsRF. Subgoal 4.2: Variables: SF SG PC LA LB LE LRF RF1 E F IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LA @ LevB : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LB LevA1 : level SF SG PC E LE * LevA2 : levelRecFields SF SG PC RF1 LRF * LevA3 : join LE LRF LA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 ============================ LA = LB
< LevB: case LevB. Subgoal 4.2: Variables: SF SG PC LA LB LE LRF RF1 E F LE1 LRF1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LA @ LevA1 : level SF SG PC E LE * LevA2 : levelRecFields SF SG PC RF1 LRF * LevA3 : join LE LRF LA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 LevB : level SF SG PC E LE1 LevB1 : levelRecFields SF SG PC RF1 LRF1 LevB2 : join LE1 LRF1 LB ============================ LA = LB
< apply IH_E to _ _ _ _ LevA1 LevB. Subgoal 4.2: Variables: SF SG PC LA LB LRF RF1 E F LE1 LRF1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LA @ LevA1 : level SF SG PC E LE1 * LevA2 : levelRecFields SF SG PC RF1 LRF * LevA3 : join LE1 LRF LA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 LevB : level SF SG PC E LE1 LevB1 : levelRecFields SF SG PC RF1 LRF1 LevB2 : join LE1 LRF1 LB ============================ LA = LB
< apply IH_RF to _ _ _ _ LevA2 LevB1. Subgoal 4.2: Variables: SF SG PC LA LB RF1 E F LE1 LRF1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LA @ LevA1 : level SF SG PC E LE1 * LevA2 : levelRecFields SF SG PC RF1 LRF1 * LevA3 : join LE1 LRF1 LA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 LevB : level SF SG PC E LE1 LevB1 : levelRecFields SF SG PC RF1 LRF1 LevB2 : join LE1 LRF1 LB ============================ LA = LB
< apply level_is to _ _ _ LevA1. Subgoal 4.2: Variables: SF SG PC LA LB RF1 E F LE1 LRF1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LA @ LevA1 : level SF SG PC E LE1 * LevA2 : levelRecFields SF SG PC RF1 LRF1 * LevA3 : join LE1 LRF1 LA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 LevB : level SF SG PC E LE1 LevB1 : levelRecFields SF SG PC RF1 LRF1 LevB2 : join LE1 LRF1 LB H4 : is_slev LE1 ============================ LA = LB
< apply levelRecFields_is to _ _ _ LevA2. Subgoal 4.2: Variables: SF SG PC LA LB RF1 E F LE1 LRF1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LA @ LevA1 : level SF SG PC E LE1 * LevA2 : levelRecFields SF SG PC RF1 LRF1 * LevA3 : join LE1 LRF1 LA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 LevB : level SF SG PC E LE1 LevB1 : levelRecFields SF SG PC RF1 LRF1 LevB2 : join LE1 LRF1 LB H4 : is_slev LE1 H5 : is_slev LRF1 ============================ LA = LB
< apply join_unique to _ _ LevA3 LevB2. Subgoal 4.2: Variables: SF SG PC LB RF1 E F LE1 LRF1 IH_E : forall SF SG PC E LA LB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> level SF SG PC E LA * -> level SF SG PC E LB -> LA = LB IH_S : forall SF SG PC S SGA SGB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> secure SF SG PC S SGA * -> secure SF SG PC S SGB -> SGA = SGB IH_A : forall SF SG PC A LA LB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelArgs SF SG PC A LA * -> levelArgs SF SG PC A LB -> LA = LB IH_RF : forall SF SG PC RF LA LB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> levelRecFields SF SG PC RF LA * -> levelRecFields SF SG PC RF LB -> LA = LB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC LevA : levelRecFields SF SG PC (consRecFieldExprs F E RF1) LB @ LevA1 : level SF SG PC E LE1 * LevA2 : levelRecFields SF SG PC RF1 LRF1 * LevA3 : join LE1 LRF1 LB H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs RF1 LevB : level SF SG PC E LE1 LevB1 : levelRecFields SF SG PC RF1 LRF1 LevB2 : join LE1 LRF1 LB H4 : is_slev LE1 H5 : is_slev LRF1 ============================ LB = LB
< search. Proof completed.
< Extensible_Theorem secure_older_scopes : forall SF Scope SG PC S SG', IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> Sec : secure SF (Scope::SG) PC S SG' -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) on Sec. Subgoal 1: Variables: SF Scope SG PC IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC noop (Scope::SG) @ ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 2: Variables: SF Scope SG PC SG' SG3 S2 S1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) SG' @ Sec1 : secure SF (Scope::SG) PC S1 SG3 * Sec2 : secure SF SG3 PC S2 SG' * ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< case IsS. Subgoal 2: Variables: SF Scope SG PC SG' SG3 S2 S1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) SG' @ Sec1 : secure SF (Scope::SG) PC S1 SG3 * Sec2 : secure SF SG3 PC S2 SG' * H1 : is_stmt S1 H2 : is_stmt S2 ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< A: apply IH to _ _ _ Sec1. Subgoal 2: Variables: SF Scope SG PC SG' S2 S1 Scope' IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) SG' @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 SG' * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< apply secure_is to _ _ _ Sec1. Subgoal 2: Variables: SF Scope SG PC SG' S2 S1 Scope' IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) SG' @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 SG' * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< B: apply IH to _ _ _ Sec2. Subgoal 2: Variables: SF Scope SG PC S2 S1 Scope' Scope'1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) (Scope'1::SG) @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 (Scope'1::SG) * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) B : forall X L, lookup Scope' X L -> lookup Scope'1 X L ============================ exists Scope', Scope'1::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< exists Scope'1. Subgoal 2: Variables: SF Scope SG PC S2 S1 Scope' Scope'1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) (Scope'1::SG) @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 (Scope'1::SG) * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) B : forall X L, lookup Scope' X L -> lookup Scope'1 X L ============================ Scope'1::SG = Scope'1::SG /\ (forall X L, lookup Scope X L -> lookup Scope'1 X L)
< split. Subgoal 2.1: Variables: SF Scope SG PC S2 S1 Scope' Scope'1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) (Scope'1::SG) @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 (Scope'1::SG) * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) B : forall X L, lookup Scope' X L -> lookup Scope'1 X L ============================ Scope'1::SG = Scope'1::SG
< search. Subgoal 2.2: Variables: SF Scope SG PC S2 S1 Scope' Scope'1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) (Scope'1::SG) @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 (Scope'1::SG) * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) B : forall X L, lookup Scope' X L -> lookup Scope'1 X L ============================ forall X L, lookup Scope X L -> lookup Scope'1 X L
< intros L. Subgoal 2.2: Variables: SF Scope SG PC S2 S1 Scope' Scope'1 X L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) (Scope'1::SG) @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 (Scope'1::SG) * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) B : forall X L, lookup Scope' X L -> lookup Scope'1 X L L : lookup Scope X L ============================ lookup Scope'1 X L
< L': apply A to L. Subgoal 2.2: Variables: SF Scope SG PC S2 S1 Scope' Scope'1 X L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) (Scope'1::SG) @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 (Scope'1::SG) * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) B : forall X L, lookup Scope' X L -> lookup Scope'1 X L L : lookup Scope X L L' : lookup Scope' X L ============================ lookup Scope'1 X L
< apply B to L'. Subgoal 2.2: Variables: SF Scope SG PC S2 S1 Scope' Scope'1 X L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (seq S1 S2) (Scope'1::SG) @ Sec1 : secure SF (Scope::SG) PC S1 (Scope'::SG) * Sec2 : secure SF (Scope'::SG) PC S2 (Scope'1::SG) * H1 : is_stmt S1 H2 : is_stmt S2 A : forall X L, lookup Scope X L -> lookup Scope' X L H3 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) B : forall X L, lookup Scope' X L -> lookup Scope'1 X L L : lookup Scope X L L' : lookup Scope' X L H4 : lookup Scope'1 X L ============================ lookup Scope'1 X L
< search. Subgoal 3: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ exists Scope', ((X, public)::Scope)::SG = Scope'::SG /\ (forall X1 L, lookup Scope X1 L -> lookup Scope' X1 L)
< exists (X, public)::Scope. Subgoal 3: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ ((X, public)::Scope)::SG = ((X, public)::Scope)::SG /\ (forall X1 L, lookup Scope X1 L -> lookup ((X, public)::Scope) X1 L)
< split. Subgoal 3.1: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ ((X, public)::Scope)::SG = ((X, public)::Scope)::SG
< search. Subgoal 3.2: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ forall X1 L, lookup Scope X1 L -> lookup ((X, public)::Scope) X1 L
< intros L. Subgoal 3.2: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L ============================ lookup ((X, public)::Scope) X1 L
< assert X = X1 -> false. Subgoal 3.2.1: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L ============================ X = X1 -> false
< intros E. Subgoal 3.2.1: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L E : X = X1 ============================ false
< case E. Subgoal 3.2.1: Variables: SF Scope SG E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X1 E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X1 E) (((X1, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X1 L : lookup Scope X1 L ============================ false
< apply no_lookup to Sec2 L. Subgoal 3.2: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (declare Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L H1 : X = X1 -> false ============================ lookup ((X, public)::Scope) X1 L
< search. Subgoal 4: Variables: SF Scope SG PC L E X IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (assign X E) (Scope::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : lookupScopes X (Scope::SG) private ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 5: Variables: SF Scope SG E X IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (assign X E) (Scope::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : lookupScopes X (Scope::SG) public ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 6: Variables: SF Scope SG PC L E Fields Rec IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (recUpdate Rec Fields E) (Scope::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : lookupScopes Rec (Scope::SG) private ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 7: Variables: SF Scope SG E Fields Rec IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (recUpdate Rec Fields E) (Scope::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : lookupScopes Rec (Scope::SG) public ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 8: Variables: SF Scope SG PC L Sl1 SGT SGF F T E IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (ifThenElse E T F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (ifThenElse E T F) (Scope::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : join L PC Sl1 Sec3 : secure SF ([]::(Scope::SG)) Sl1 T SGT * Sec4 : secure SF ([]::(Scope::SG)) Sl1 F SGF * ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 9: Variables: SF Scope SG L Scope1 SG2 S1 E IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) private (while E S1) (Scope::SG) @ Sec1 : level SF (Scope::SG) private E L * Sec2 : secure SF ([]::(Scope::SG)) private S1 (Scope1::SG2) * ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 10: Variables: SF Scope SG Scope1 SG2 S1 E IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (while E S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (while E S1) (Scope::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : secure SF ([]::(Scope::SG)) public S1 (Scope1::SG2) * ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 11: Variables: SF Scope SG PC Scope1 S1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (scopeStmt S1) (Scope::SG) @ Sec1 : secure SF ([]::(Scope::SG)) PC S1 (Scope1::(Scope::SG)) * ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 12: Variables: SF Scope SG E IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (printVal E) (Scope::SG) @ Sec1 : level SF (Scope::SG) public E public * ============================ exists Scope', Scope::SG = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< search. Subgoal 13: Variables: SF Scope SG PC L X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X ============================ exists Scope', ((X, private)::Scope)::SG = Scope'::SG /\ (forall X1 L, lookup Scope X1 L -> lookup Scope' X1 L)
< exists (X, private)::Scope. Subgoal 13: Variables: SF Scope SG PC L X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X ============================ ((X, private)::Scope)::SG = ((X, private)::Scope)::SG /\ (forall X1 L, lookup Scope X1 L -> lookup ((X, private)::Scope) X1 L)
< split. Subgoal 13.1: Variables: SF Scope SG PC L X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X ============================ ((X, private)::Scope)::SG = ((X, private)::Scope)::SG
< search. Subgoal 13.2: Variables: SF Scope SG PC L X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X ============================ forall X1 L, lookup Scope X1 L -> lookup ((X, private)::Scope) X1 L
< intros L. Subgoal 13.2: Variables: SF Scope SG PC L X E Ty X1 L1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X L : lookup Scope X1 L1 ============================ lookup ((X, private)::Scope) X1 L1
< assert X = X1 -> false. Subgoal 13.2.1: Variables: SF Scope SG PC L X E Ty X1 L1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X L : lookup Scope X1 L1 ============================ X = X1 -> false
< intros E. Subgoal 13.2.1: Variables: SF Scope SG PC L X E Ty X1 L1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X L : lookup Scope X1 L1 E : X = X1 ============================ false
< case E. Subgoal 13.2.1: Variables: SF Scope SG PC L E Ty X1 L1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X1 E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X1 E) (((X1, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X1 L : lookup Scope X1 L1 ============================ false
< apply no_lookup to Sec2 L. Subgoal 13.2: Variables: SF Scope SG PC L X E Ty X1 L1 IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl private Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC (secdecl private Ty X E) (((X, private)::Scope)::SG) @ Sec1 : level SF (Scope::SG) PC E L * Sec2 : no_lookup Scope X L : lookup Scope X1 L1 H1 : X = X1 -> false ============================ lookup ((X, private)::Scope) X1 L1
< search. Subgoal 14: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ exists Scope', ((X, public)::Scope)::SG = Scope'::SG /\ (forall X1 L, lookup Scope X1 L -> lookup Scope' X1 L)
< exists (X, public)::Scope. Subgoal 14: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ ((X, public)::Scope)::SG = ((X, public)::Scope)::SG /\ (forall X1 L, lookup Scope X1 L -> lookup ((X, public)::Scope) X1 L)
< split. Subgoal 14.1: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ ((X, public)::Scope)::SG = ((X, public)::Scope)::SG
< search. Subgoal 14.2: Variables: SF Scope SG X E Ty IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X ============================ forall X1 L, lookup Scope X1 L -> lookup ((X, public)::Scope) X1 L
< intros L. Subgoal 14.2: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L ============================ lookup ((X, public)::Scope) X1 L
< assert X = X1 -> false. Subgoal 14.2.1: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L ============================ X = X1 -> false
< intros E. Subgoal 14.2.1: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L E : X = X1 ============================ false
< case E. Subgoal 14.2.1: Variables: SF Scope SG E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X1 E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X1 E) (((X1, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X1 L : lookup Scope X1 L ============================ false
< apply no_lookup to Sec2 L. Subgoal 14.2: Variables: SF Scope SG X E Ty X1 L IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt (secdecl public Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) public (secdecl public Ty X E) (((X, public)::Scope)::SG) @ Sec1 : level SF (Scope::SG) public E public * Sec2 : no_lookup Scope X L : lookup Scope X1 L H1 : X = X1 -> false ============================ lookup ((X, public)::Scope) X1 L
< search. Subgoal 15: Variables: SF Scope SG PC SG' Names S_P IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC <unknown I stmt> SG' @ Sec1 : names (Scope::SG) Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF (Scope::SG) PC S_P SG' * ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< apply names_is_sec to _ Sec1. Subgoal 15: Variables: SF Scope SG PC SG' Names S_P IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC <unknown I stmt> SG' @ Sec1 : names (Scope::SG) Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF (Scope::SG) PC S_P SG' * H1 : is_list is_string Names ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< apply proj_stmt_is to Sec2 _ _. Subgoal 15: Variables: SF Scope SG PC SG' Names S_P IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC <unknown I stmt> SG' @ Sec1 : names (Scope::SG) Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF (Scope::SG) PC S_P SG' * H1 : is_list is_string Names H2 : is_stmt S_P ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< apply proj_stmt_is to Sec2 _ _. Subgoal 15: Variables: SF Scope SG PC SG' Names S_P IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC <unknown I stmt> SG' @ Sec1 : names (Scope::SG) Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF (Scope::SG) PC S_P SG' * H1 : is_list is_string Names H2 : is_stmt S_P H3 : is_stmt S_P ============================ exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L)
< apply IH to _ _ _ Sec3. Subgoal 15: Variables: SF Scope SG PC Names S_P Scope' IH : forall SF Scope SG PC S SG', is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (Scope::SG) -> secure SF (Scope::SG) PC S SG' * -> exists Scope', SG' = Scope'::SG /\ (forall X L, lookup Scope X L -> lookup Scope' X L) IsS : is_stmt <unknown I stmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope::SG) Sec : secure SF (Scope::SG) PC <unknown I stmt> (Scope'::SG) @ Sec1 : names (Scope::SG) Names Sec2 : Names |{stmt}- <unknown I stmt> ~~> S_P Sec3 : secure SF (Scope::SG) PC S_P (Scope'::SG) * H1 : is_list is_string Names H2 : is_stmt S_P H3 : is_stmt S_P H4 : forall X L, lookup Scope X L -> lookup Scope' X L ============================ exists Scope'1, Scope'::SG = Scope'1::SG /\ (forall X L, lookup Scope X L -> lookup Scope'1 X L)
< search. Proof completed.
< Theorem names_same_scopes_same [V] : forall A B (C : list (list (pair (string) V))), is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C -> scopes_same A B -> names_same B C. ============================ forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C -> scopes_same A B -> names_same B C
< induction on 3. IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C ============================ forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C @ -> scopes_same A B -> names_same B C
< intros IsA IsB NS SS. Variables: A B C IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C IsA : is_list (is_list (is_pair is_string is_value)) A IsB : is_list (is_list (is_pair is_string is_value)) B NS : names_same A C @ SS : scopes_same A B ============================ names_same B C
< NS: case NS. Subgoal 1: Variables: B IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C IsA : is_list (is_list (is_pair is_string is_value)) [] IsB : is_list (is_list (is_pair is_string is_value)) B SS : scopes_same [] B ============================ names_same B []
< case SS. Subgoal 1: IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C IsA : is_list (is_list (is_pair is_string is_value)) [] IsB : is_list (is_list (is_pair is_string is_value)) [] ============================ names_same [] []
< search. Subgoal 2: Variables: B BRest B1 ARest A1 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C IsA : is_list (is_list (is_pair is_string is_value)) (A1::ARest) IsB : is_list (is_list (is_pair is_string is_value)) B SS : scopes_same (A1::ARest) B NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * ============================ names_same B (B1::BRest)
< SS: case SS. Subgoal 2: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C IsA : is_list (is_list (is_pair is_string is_value)) (A1::ARest) IsB : is_list (is_list (is_pair is_string is_value)) (B2::BRest1) NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 ============================ names_same (B2::BRest1) (B1::BRest)
< IsA: case IsA. Subgoal 2: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C IsB : is_list (is_list (is_pair is_string is_value)) (B2::BRest1) NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest ============================ names_same (B2::BRest1) (B1::BRest)
< IsB: case IsB. Subgoal 2: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 ============================ names_same (B2::BRest1) (B1::BRest)
< unfold . Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 ============================ forall X IA, mem (X, IA) B2 -> exists IB, mem (X, IB) B1
< intros MB. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X IA IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MB : mem (X, IA) B2 ============================ exists IB, mem (X, IB) B1
< IsP: apply mem_is to _ MB. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X IA IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MB : mem (X, IA) B2 IsP : is_pair is_string is_value (X, IA) ============================ exists IB, mem (X, IB) B1
< IsX: case IsP. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X IA IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MB : mem (X, IA) B2 IsX : is_string X IsX1 : is_value IA ============================ exists IB, mem (X, IB) B1
< LB: apply is_list_mem_lookup to _ MB _. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X IA E' IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MB : mem (X, IA) B2 IsX : is_string X IsX1 : is_value IA LB : lookup B2 X E' ============================ exists IB, mem (X, IB) B1
< LA: apply SS1 to LB. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X IA E' IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MB : mem (X, IA) B2 IsX : is_string X IsX1 : is_value IA LB : lookup B2 X E' LA : lookup A1 X E' ============================ exists IB, mem (X, IB) B1
< MA: apply lookup_mem to LA. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X IA E' IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MB : mem (X, IA) B2 IsX : is_string X IsX1 : is_value IA LB : lookup B2 X E' LA : lookup A1 X E' MA : mem (X, E') A1 ============================ exists IB, mem (X, IB) B1
< apply NS to MA. Subgoal 2.1: Variables: BRest B1 ARest A1 BRest1 B2 X IA E' IB IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MB : mem (X, IA) B2 IsX : is_string X IsX1 : is_value IA LB : lookup B2 X E' LA : lookup A1 X E' MA : mem (X, E') A1 H1 : mem (X, IB) B1 ============================ exists IB, mem (X, IB) B1
< search. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 ============================ forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) B2
< intros MC. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X IB IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MC : mem (X, IB) B1 ============================ exists IA, mem (X, IA) B2
< MA: apply NS1 to MC. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X IB IA IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MC : mem (X, IB) B1 MA : mem (X, IA) A1 ============================ exists IA, mem (X, IA) B2
< IsP: apply mem_is to _ MA. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X IB IA IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MC : mem (X, IB) B1 MA : mem (X, IA) A1 IsP : is_pair is_string is_value (X, IA) ============================ exists IA, mem (X, IA) B2
< IsX: case IsP. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X IB IA IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MC : mem (X, IB) B1 MA : mem (X, IA) A1 IsX : is_string X IsX1 : is_value IA ============================ exists IA, mem (X, IA) B2
< LA: apply is_list_mem_lookup to _ MA _. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X IB IA E' IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MC : mem (X, IB) B1 MA : mem (X, IA) A1 IsX : is_string X IsX1 : is_value IA LA : lookup A1 X E' ============================ exists IA, mem (X, IA) B2
< LB: apply SS to LA. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X IB IA E' IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MC : mem (X, IB) B1 MA : mem (X, IA) A1 IsX : is_string X IsX1 : is_value IA LA : lookup A1 X E' LB : lookup B2 X E' ============================ exists IA, mem (X, IA) B2
< MB: apply lookup_mem to LB. Subgoal 2.2: Variables: BRest B1 ARest A1 BRest1 B2 X IB IA E' IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 MC : mem (X, IB) B1 MA : mem (X, IA) A1 IsX : is_string X IsX1 : is_value IA LA : lookup A1 X E' LB : lookup B2 X E' MB : mem (X, E') B2 ============================ exists IA, mem (X, IA) B2
< search. Subgoal 2.3: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 ============================ names_same BRest1 BRest
< apply IH to _ _ NS2 SS2. Subgoal 2.3: Variables: BRest B1 ARest A1 BRest1 B2 IH : forall A B C, is_list (is_list (is_pair is_string is_value)) A -> is_list (is_list (is_pair is_string is_value)) B -> names_same A C * -> scopes_same A B -> names_same B C NS : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B1 NS1 : forall X IB, mem (X, IB) B1 -> exists IA, mem (X, IA) A1 NS2 : names_same ARest BRest * SS : forall X V, lookup A1 X V -> lookup B2 X V SS1 : forall X V, lookup B2 X V -> lookup A1 X V SS2 : scopes_same ARest BRest1 IsA : is_list (is_pair is_string is_value) A1 IsA1 : is_list (is_list (is_pair is_string is_value)) ARest IsB : is_list (is_pair is_string is_value) B2 IsB1 : is_list (is_list (is_pair is_string is_value)) BRest1 H1 : names_same BRest1 BRest ============================ names_same BRest1 BRest
< search. Proof completed.
< Theorem zip_names_same [A, B] : forall (Names : list (string)) (A : list A) (B : list B) ZA ZB, zip Names A ZA -> zip Names B ZB -> names_same [ZA] [ZB]. ============================ forall Names A B ZA ZB, zip Names A ZA -> zip Names B ZB -> names_same [ZA] [ZB]
< induction on 1. IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ============================ forall Names A B ZA ZB, zip Names A ZA @ -> zip Names B ZB -> names_same [ZA] [ZB]
< intros ZA ZB. Variables: Names A B ZA ZB IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip Names A ZA @ ZB : zip Names B ZB ============================ names_same [ZA] [ZB]
< ZA: case ZA. Subgoal 1: Variables: B ZB IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZB : zip [] B ZB ============================ names_same [[]] [ZB]
< case ZB. Subgoal 1: IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ============================ names_same [[]] [[]]
< unfold . Subgoal 1.1: IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ============================ forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
< intros M. Subgoal 1.1: Variables: X IA IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] M : mem (X, IA) [] ============================ exists IB, mem (X, IB) []
< case M. Subgoal 1.2: IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ============================ forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
< intros M. Subgoal 1.2: Variables: X IB IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] M : mem (X, IB) [] ============================ exists IA, mem (X, IA) []
< case M. Subgoal 1.3: IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ============================ names_same [] []
< search. Subgoal 2: Variables: B ZB Rest B1 A1 BRest ARest IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZB : zip (A1::ARest) B ZB ZA : zip ARest BRest Rest * ============================ names_same [(A1, B1)::Rest] [ZB]
< ZB: case ZB. Subgoal 2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 ============================ names_same [(A1, B1)::Rest] [(A1, B2)::Rest1]
< NS: apply IH to ZA ZB. Subgoal 2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : names_same [Rest] [Rest1] ============================ names_same [(A1, B1)::Rest] [(A1, B2)::Rest1]
< NS: case NS. Subgoal 2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] ============================ names_same [(A1, B1)::Rest] [(A1, B2)::Rest1]
< unfold . Subgoal 2.1: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] ============================ forall X IA, mem (X, IA) ((A1, B1)::Rest) -> exists IB, mem (X, IB) ((A1, B2)::Rest1)
< intros M. Subgoal 2.1: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 X IA IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] M : mem (X, IA) ((A1, B1)::Rest) ============================ exists IB, mem (X, IB) ((A1, B2)::Rest1)
< M: case M. Subgoal 2.1.1: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] ============================ exists IB, mem (A1, IB) ((A1, B2)::Rest1)
< search. Subgoal 2.1.2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 X IA IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] M : mem (X, IA) Rest ============================ exists IB, mem (X, IB) ((A1, B2)::Rest1)
< apply NS to M. Subgoal 2.1.2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 X IA IB IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] M : mem (X, IA) Rest H1 : mem (X, IB) Rest1 ============================ exists IB, mem (X, IB) ((A1, B2)::Rest1)
< search. Subgoal 2.2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] ============================ forall X IB, mem (X, IB) ((A1, B2)::Rest1) -> exists IA, mem (X, IA) ((A1, B1)::Rest)
< intros M. Subgoal 2.2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 X IB IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] M : mem (X, IB) ((A1, B2)::Rest1) ============================ exists IA, mem (X, IA) ((A1, B1)::Rest)
< M: case M. Subgoal 2.2.1: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] ============================ exists IA, mem (A1, IA) ((A1, B1)::Rest)
< search. Subgoal 2.2.2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 X IB IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] M : mem (X, IB) Rest1 ============================ exists IA, mem (X, IA) ((A1, B1)::Rest)
< apply NS1 to M. Subgoal 2.2.2: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 X IB IA IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] M : mem (X, IB) Rest1 H1 : mem (X, IA) Rest ============================ exists IA, mem (X, IA) ((A1, B1)::Rest)
< search. Subgoal 2.3: Variables: Rest B1 A1 BRest ARest Rest1 B2 BRest1 IH : forall Names A B ZA ZB, zip Names A ZA * -> zip Names B ZB -> names_same [ZA] [ZB] ZA : zip ARest BRest Rest * ZB : zip ARest BRest1 Rest1 NS : forall X IA, mem (X, IA) Rest -> exists IB, mem (X, IB) Rest1 NS1 : forall X IB, mem (X, IB) Rest1 -> exists IA, mem (X, IA) Rest NS2 : names_same [] [] ============================ names_same [] []
< search. Proof completed.
< Extensible_Theorem level_eval_names_same : forall E SF SG PC L FE EE V EE' O, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> NS : names_same EE SG -> Ev : evalExpr FE EE E V EE' O -> Lev : level SF SG PC E L -> names_same EE' SG on Ev, secure_eval_names_same : forall S SF SG PC SG' FE Scope EE EE' O, IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsFE : is_list (is_pair is_string (is_pair is_string (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) -> NS : names_same (Scope::EE) SG -> Ev : evalStmt FE (Scope::EE) S EE' O -> Sec : secure SF SG PC S SG' -> names_same EE' SG' on Ev, levelArgs_eval_names_same : forall A SF SG PC L FE EE V EE' O, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> NS : names_same EE SG -> Ev : evalArgs FE EE A V EE' O -> Lev : levelArgs SF SG PC A L -> names_same EE' SG on Ev, levelRecFields_eval_names_same : forall RF SF SG PC L FE EE V EE' O, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> NS : names_same EE SG -> Ev : evalRecFields FE EE RF V EE' O -> Lev : levelRecFields SF SG PC RF L -> names_same EE' SG on Ev. Subgoal 1: Variables: E SF SG PC L FE EE V EE' O IsE : is_expr E IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE E V EE' O Lev : level SF SG PC E L ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 2: Variables: S SF SG PC SG' FE Scope EE EE' O IsS : is_stmt S IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) S EE' O Sec : secure SF SG PC S SG' ============================ is_list (is_pair is_string (is_pair is_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) /\ is_stmt S)
< search. Subgoal 3: Variables: A SF SG PC L FE EE V EE' O IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE A V EE' O Lev : levelArgs SF SG PC A L ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 4: Variables: RF SF SG PC L FE EE V EE' O IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE RF V EE' O Lev : levelRecFields SF SG PC RF L ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 5.1.1: Variables: SF SG PC L FE EE' I IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ Lev : level SF SG PC (num I) L ============================ names_same EE' SG
< case Lev. Subgoal 5.1.1: Variables: SF SG PC FE EE' I IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ ============================ names_same EE' SG
< search. Subgoal 5.1.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (plus E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (plus E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (minus E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (minus E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (mult E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (mult E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (div E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (div E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.6: Variables: SF SG PC L FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' true trueVal EE' [] @ Lev : level SF SG PC true L ============================ names_same EE' SG
< case Lev. Subgoal 5.1.6: Variables: SF SG PC FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' true trueVal EE' [] @ ============================ names_same EE' SG
< search. Subgoal 5.1.7: Variables: SF SG PC L FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' false falseVal EE' [] @ Lev : level SF SG PC false L ============================ names_same EE' SG
< case Lev. Subgoal 5.1.7: Variables: SF SG PC FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' false falseVal EE' [] @ ============================ names_same EE' SG
< search. Subgoal 5.1.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Lev : level SF SG PC (and E1 E2) L Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Lev : level SF SG PC (and E1 E2) L Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev2. Subgoal 5.1.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.9: Variables: SF SG PC L FE EE EE' O E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ names_same EE' SG
< case IsE. Subgoal 5.1.9: Variables: SF SG PC L FE EE EE' O E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.9: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.9: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev2. Subgoal 5.1.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.11: Variables: SF SG PC L FE EE EE' O E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ names_same EE' SG
< case IsE. Subgoal 5.1.11: Variables: SF SG PC L FE EE EE' O E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.11: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.11: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev2. Subgoal 5.1.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Lev : level SF SG PC (or E1 E2) L Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Lev : level SF SG PC (or E1 E2) L Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev2. Subgoal 5.1.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.14: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Lev : level SF SG PC (not E1) L Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ names_same EE' SG
< case IsE. Subgoal 5.1.14: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Lev : level SF SG PC (not E1) L Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.14: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.14: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L H2 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.15: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Lev : level SF SG PC (not E1) L Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ names_same EE' SG
< case IsE. Subgoal 5.1.15: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Lev : level SF SG PC (not E1) L Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.15: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.15: Variables: SF SG PC L FE EE EE' O E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L H2 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Lev : level SF SG PC (greater E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Lev : level SF SG PC (greater E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Lev : level SF SG PC (greater E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Lev : level SF SG PC (greater E1 E2) L Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Lev : level SF SG PC (eq E1 E2) L Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Lev : level SF SG PC (eq E1 E2) L Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Lev : level SF SG PC (eq E1 E2) L Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Lev : level SF SG PC (eq E1 E2) L Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.20: Variables: SF SG PC L FE EE' S IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ Lev : level SF SG PC (stringLit S) L ============================ names_same EE' SG
< case Lev. Subgoal 5.1.20: Variables: SF SG PC FE EE' S IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ ============================ names_same EE' SG
< search. Subgoal 5.1.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Lev : level SF SG PC (appString E1 E2) L Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Lev : level SF SG PC (appString E1 E2) L Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ NS Ev1 Lev. Subgoal 5.1.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.22: Variables: SF SG PC L FE V EE' X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (name X) V EE' [] @ Lev : level SF SG PC (name X) L Ev1 : lookupScopes X EE' V ============================ names_same EE' SG
< case Lev. Subgoal 5.1.22: Variables: SF SG PC L FE V EE' X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (name X) V EE' [] @ Ev1 : lookupScopes X EE' V H1 : lookupScopes X SG L ============================ names_same EE' SG
< search. Subgoal 5.1.23: Variables: SF SG PC L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Lev : level SF SG PC (call Fun Args) L Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ names_same EE' SG
< case IsE. Subgoal 5.1.23: Variables: SF SG PC L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Lev : level SF SG PC (call Fun Args) L Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ names_same EE' SG
< apply IH2 to _ _ _ _ _ NS Ev2 Lev1. Subgoal 5.1.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.23.2: Variables: SF SG L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs ============================ names_same EE' SG
< apply IH2 to _ _ _ _ _ NS Ev2 Lev1. Subgoal 5.1.23.2: Variables: SF SG L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Lev : level SF SG PC (stmtExpr S E1) L Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsE. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Lev : level SF SG PC (stmtExpr S E1) L Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L ============================ names_same EE' SG
< apply names_same_add_scope to NS. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) ============================ names_same EE' SG
< apply IH1 to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 ============================ names_same EE' SG
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) (Scope::EE') ============================ names_same EE' SG
< apply secure_is to _ _ _ Lev. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) (Scope::EE') H7 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ names_same EE' SG
< NS': apply IH to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) (Scope::EE') H7 : is_list (is_list (is_pair is_string is_slev)) SG2 NS' : names_same (Scope::EE') SG2 ============================ names_same EE' SG
< case NS'. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (B::BRest) Lev1 : level SF (B::BRest) PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 (B::BRest) H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) (Scope::EE') H7 : is_list (is_list (is_pair is_string is_slev)) (B::BRest) H8 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H9 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H10 : names_same EE' BRest ============================ names_same EE' SG
< apply secure_older_scopes to _ _ _ Lev. Subgoal 5.1.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 (Scope'::SG) H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_value)) (Scope::EE') H7 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) H8 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' H9 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope H10 : names_same EE' SG H11 : forall X L, lookup [] X L -> lookup Scope' X L ============================ names_same EE' SG
< search. Subgoal 5.1.25: Variables: SF SG PC L FE EE EE' O VF RF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (recBuild RF) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Lev : level SF SG PC (recBuild RF) L Ev1 : evalRecFields FE EE RF VF EE' O * ============================ names_same EE' SG
< case IsE. Subgoal 5.1.25: Variables: SF SG PC L FE EE EE' O VF RF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Lev : level SF SG PC (recBuild RF) L Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.25: Variables: SF SG PC L FE EE EE' O VF RF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L ============================ names_same EE' SG
< apply IH3 to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.1.25: Variables: SF SG PC L FE EE EE' O VF RF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L H2 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr (recFieldAccess Rec F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Lev : level SF SG PC (recFieldAccess Rec F) L Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ names_same EE' SG
< case IsE. Subgoal 5.1.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Lev : level SF SG PC (recFieldAccess Rec F) L Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.1.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L H3 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Lev : level SF SG PC <unknown K evalExpr> L Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L ============================ names_same EE' SG
< apply names_is to _ Ev1. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names ============================ names_same EE' SG
< apply names_is_sec to _ Lev. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ names_same EE' SG
< apply proj_expr_unique to Lev1 Ev2 _ _ _ _ _. Subgoal 5.1.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.1.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NS Ev1 Lev M. Subgoal 5.1.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.1.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.1.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NS Ev1 Lev M. Subgoal 5.1.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ names_same EE' SG
< apply proj_expr_is to Lev1 _ _. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P ============================ names_same EE' SG
< NS': apply IH to _ _ _ _ _ _ Ev3 Lev2. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG ============================ names_same EE' SG
< EvP: apply proj_evalExpr_forward to Ev2 Ev1 _ _ _ Ev. Subgoal 5.1.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 EE'' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG EvP : evalExpr FE EE E_P V EE'' O EvP1 : scopes_same EE' EE'' ============================ names_same EE' SG
< apply evalExpr_unique to _ _ _ EvP Ev3. Subgoal 5.1.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' O_P @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG EvP : evalExpr FE EE E_P V_P EE_P O_P EvP1 : scopes_same EE' EE_P ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 5.1.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' O_P @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG EvP : evalExpr FE EE E_P V_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ EvP. Subgoal 5.1.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' O_P @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG EvP : evalExpr FE EE E_P V_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' H5 : is_list (is_list (is_pair is_string is_value)) EE_P ============================ names_same EE' SG
< SS: apply scopes_same_symm to EvP1. Subgoal 5.1.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' O_P @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG EvP : evalExpr FE EE E_P V_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' H5 : is_list (is_list (is_pair is_string is_value)) EE_P SS : scopes_same EE_P EE' ============================ names_same EE' SG
< apply names_same_scopes_same to _ _ NS' SS. Subgoal 5.1.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' O_P @ Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG EvP : evalExpr FE EE E_P V_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' H5 : is_list (is_list (is_pair is_string is_value)) EE_P SS : scopes_same EE_P EE' H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.2.1: Variables: SF SG PC SG' FE Scope EE IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) noop (Scope::EE) [] @ Sec : secure SF SG PC noop SG' ============================ names_same (Scope::EE) SG'
< case Sec. Subgoal 5.2.1: Variables: SF PC SG' FE Scope EE IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) noop (Scope::EE) [] @ ============================ names_same (Scope::EE) SG'
< search. Subgoal 5.2.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Sec : secure SF SG PC (seq S1 S2) SG' Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Sec : secure SF SG PC (seq S1 S2) SG' Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' ============================ names_same EE' SG'
< NS': apply IH1 to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' NS' : names_same EE3 SG3 ============================ names_same EE' SG'
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 5.2.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' NS' : names_same EE3 SG3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG'
< apply secure_is to _ _ _ Sec. Subgoal 5.2.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' NS' : names_same EE3 SG3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_slev)) SG3 ============================ names_same EE' SG'
< case NS. Subgoal 5.2.2: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3 BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' NS' : names_same EE3 SG3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_slev)) SG3 H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest ============================ names_same EE' SG'
< apply secure_older_scopes to _ _ _ Sec. Subgoal 5.2.2: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 BRest B Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' NS' : names_same EE3 (Scope'::BRest) H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest H8 : forall X L, lookup B X L -> lookup Scope' X L ============================ names_same EE' SG'
< case NS' (keep). Subgoal 5.2.2: Variables: SF PC SG' FE Scope EE EE' O O2 O3 S2 S1 BRest B Scope' ARest A IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' NS' : names_same (A::ARest) (Scope'::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest H8 : forall X L, lookup B X L -> lookup Scope' X L H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H10 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H11 : names_same ARest BRest ============================ names_same EE' SG'
< apply IH1 to _ _ _ _ _ _ Ev2 Sec1. Subgoal 5.2.2: Variables: SF PC SG' FE Scope EE EE' O O2 O3 S2 S1 BRest B Scope' ARest A IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (seq S1 S2) EE' O @ Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' NS' : names_same (A::ARest) (Scope'::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest H8 : forall X L, lookup B X L -> lookup Scope' X L H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H10 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H11 : names_same ARest BRest H12 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.3: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (declare Ty X E) SG' Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * ============================ names_same (((X, V)::Scope1)::EE2) SG'
< case IsS. Subgoal 5.2.3: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (declare Ty X E) SG' Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ names_same (((X, V)::Scope1)::EE2) SG'
< Sec: case Sec. Subgoal 5.2.3: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X ============================ names_same (((X, V)::Scope1)::EE2) (((X, public)::Scope2)::SG1)
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.3: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X NS' : names_same (Scope1::EE2) (Scope2::SG1) ============================ names_same (((X, V)::Scope1)::EE2) (((X, public)::Scope2)::SG1)
< R: case NS'. Subgoal 5.2.3: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ names_same (((X, V)::Scope1)::EE2) (((X, public)::Scope2)::SG1)
< unfold . Subgoal 5.2.3.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ forall X1 IA, mem (X1, IA) ((X, V)::Scope1) -> exists IB, mem (X1, IB) ((X, public)::Scope2)
< intros M. Subgoal 5.2.3.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) ((X, V)::Scope1) ============================ exists IB, mem (X1, IB) ((X, public)::Scope2)
< M: case M. Subgoal 5.2.3.1.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ exists IB, mem (X, IB) ((X, public)::Scope2)
< search. Subgoal 5.2.3.1.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) Scope1 ============================ exists IB, mem (X1, IB) ((X, public)::Scope2)
< apply R to M. Subgoal 5.2.3.1.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IA IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) Scope1 H4 : mem (X1, IB) Scope2 ============================ exists IB, mem (X1, IB) ((X, public)::Scope2)
< search. Subgoal 5.2.3.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ forall X1 IB, mem (X1, IB) ((X, public)::Scope2) -> exists IA, mem (X1, IA) ((X, V)::Scope1)
< intros M. Subgoal 5.2.3.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) ((X, public)::Scope2) ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< M: case M. Subgoal 5.2.3.2.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ exists IA, mem (X, IA) ((X, V)::Scope1)
< search. Subgoal 5.2.3.2.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) Scope2 ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< apply R1 to M. Subgoal 5.2.3.2.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IB IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) Scope2 H4 : mem (X1, IA) Scope1 ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< search. Subgoal 5.2.3.3: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ names_same EE2 SG1
< search. Subgoal 5.2.4: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Sec : secure SF SG PC (assign X E) SG' Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.4: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Sec : secure SF SG PC (assign X E) SG' Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.4.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 E X L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.4.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 E X L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private NS' : names_same EE3 SG' ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.4.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 E X L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG'
< NS'': apply replaceScopes_names_same to _ Ev2. Subgoal 5.2.4.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 E X L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' ============================ names_same EE' SG'
< NS2: apply names_same_symmetric to NS''. Subgoal 5.2.4.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 E X L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 ============================ names_same EE' SG'
< apply names_same_transitive to NS2 NS'. Subgoal 5.2.4.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 E X L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 H4 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.4.2: Variables: SF SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.4.2: Variables: SF SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public NS' : names_same EE3 SG' ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.4.2: Variables: SF SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG'
< NS'': apply replaceScopes_names_same to _ Ev2. Subgoal 5.2.4.2: Variables: SF SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' ============================ names_same EE' SG'
< NS2: apply names_same_symmetric to NS''. Subgoal 5.2.4.2: Variables: SF SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 ============================ names_same EE' SG'
< apply names_same_transitive to NS2 NS'. Subgoal 5.2.4.2: Variables: SF SG' FE Scope EE EE' O V EE3 E X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public NS' : names_same EE3 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 H4 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.5: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Sec : secure SF SG PC (recUpdate Rec Fields E) SG' Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.5: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Sec : secure SF SG PC (recUpdate Rec Fields E) SG' Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.5.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.5.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private NS' : names_same EE3 SG' ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.5.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG'
< NS'': apply replaceScopes_names_same to _ Ev4. Subgoal 5.2.5.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' ============================ names_same EE' SG'
< NS2: apply names_same_symmetric to NS''. Subgoal 5.2.5.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 ============================ names_same EE' SG'
< apply names_same_transitive to NS2 NS'. Subgoal 5.2.5.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 H5 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.5.2: Variables: SF SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.5.2: Variables: SF SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public NS' : names_same EE3 SG' ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.5.2: Variables: SF SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG'
< NS'': apply replaceScopes_names_same to _ Ev4. Subgoal 5.2.5.2: Variables: SF SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' ============================ names_same EE' SG'
< NS2: apply names_same_symmetric to NS''. Subgoal 5.2.5.2: Variables: SF SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 ============================ names_same EE' SG'
< apply names_same_transitive to NS2 NS'. Subgoal 5.2.5.2: Variables: SF SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS'' : names_same EE3 EE' NS2 : names_same EE' EE3 H5 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.6: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.6: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG'
< apply names_same_add_scope to NS'. Subgoal 5.2.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') ============================ names_same EE' SG'
< NS'': apply IH1 to _ _ _ _ _ _ Ev2 Sec2. Subgoal 5.2.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') NS'' : names_same (Scope1::EE') SGT ============================ names_same EE' SG'
< case NS''. Subgoal 5.2.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGF BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th (B::BRest) Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') H6 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope1 H8 : names_same EE' BRest ============================ names_same EE' SG'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.2.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGF Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th (Scope'::SG') Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') H6 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' H7 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 H8 : names_same EE' SG' H9 : forall X L, lookup [] X L -> lookup Scope' X L ============================ names_same EE' SG'
< search. Subgoal 5.2.7: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.7: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG'
< apply names_same_add_scope to NS'. Subgoal 5.2.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') ============================ names_same EE' SG'
< NS'': apply IH1 to _ _ _ _ _ _ Ev2 Sec3. Subgoal 5.2.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') NS'' : names_same (Scope1::EE') SGF ============================ names_same EE' SG'
< case NS''. Subgoal 5.2.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El (B::BRest) NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') H6 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope1 H8 : names_same EE' BRest ============================ names_same EE' SG'
< apply secure_older_scopes to _ _ _ Sec3. Subgoal 5.2.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El (Scope'::SG') NS' : names_same EE3 SG' H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same ([]::EE3) ([]::SG') H6 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' H7 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 H8 : names_same EE' SG' H9 : forall X L, lookup [] X L -> lookup Scope' X L ============================ names_same EE' SG'
< search. Subgoal 5.2.8: Variables: SF SG PC SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.8: Variables: SF SG PC SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ names_same EE' SG'
< Sec: case Sec (keep). Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec1. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) NS' : names_same EE2 SG' ============================ names_same EE' SG'
< NS1: apply names_same_add_scope to NS'. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ names_same EE' SG'
< NS'': apply IH1 to _ _ _ _ _ _ Ev2 Sec2. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS'' : names_same (Scope1::EE4) (Scope2::SG2) ============================ names_same EE' SG'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS'' : names_same (Scope1::EE4) (Scope'::SG') H4 : forall X L, lookup [] X L -> lookup Scope' X L ============================ names_same EE' SG'
< NS+: case NS''. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 SG' ============================ names_same EE' SG'
< IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 SG' IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE4) ============================ names_same EE' SG'
< case IsEE4+. Subgoal 5.2.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 SG' H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ names_same EE' SG'
< case NS. Subgoal 5.2.8.1: Variables: SF FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope' BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) NS' : names_same EE2 (B::BRest) NS1 : names_same ([]::EE2) ([]::(B::BRest)) H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 (B::BRest) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest ============================ names_same EE' (B::BRest)
< NS_: case NS1. Subgoal 5.2.8.1: Variables: SF FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope' BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) NS' : names_same EE2 (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 (B::BRest) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS_2 : names_same EE2 (B::BRest) ============================ names_same EE' (B::BRest)
< case NS_2. Subgoal 5.2.8.1: Variables: SF FE Scope EE EE' O O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope' BRest B ARest A IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal (A::ARest) O2 * Ev2 : evalStmt FE ([]::(A::ARest)) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) NS' : names_same (A::ARest) (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 (B::BRest) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H12 : names_same ARest BRest ============================ names_same EE' (B::BRest)
< case NS+2. Subgoal 5.2.8.1: Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope' BRest B ARest A ARest1 A1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal (A::ARest) O2 * Ev2 : evalStmt FE ([]::(A::ARest)) Body (Scope1::(A1::ARest1)) O3 * Ev3 : evalStmt FE (A1::ARest1) (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) NS' : names_same (A::ARest) (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H15 : names_same ARest1 BRest ============================ names_same EE' (B::BRest)
< apply IH1 to _ _ _ _ _ _ Ev3 Sec. Subgoal 5.2.8.1: Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope' BRest B ARest A ARest1 A1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal (A::ARest) O2 * Ev2 : evalStmt FE ([]::(A::ARest)) Body (Scope1::(A1::ARest1)) O3 * Ev3 : evalStmt FE (A1::ARest1) (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) NS' : names_same (A::ARest) (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H15 : names_same ARest1 BRest H16 : names_same EE' (B::BRest) ============================ names_same EE' (B::BRest)
< search. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope2::SG2) ============================ names_same EE' SG'
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec1. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope2::SG2) NS' : names_same EE2 SG' ============================ names_same EE' SG'
< NS1: apply names_same_add_scope to NS'. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope2::SG2) NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') ============================ names_same EE' SG'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope2::SG2) NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ names_same EE' SG'
< NS'': apply IH1 to _ _ _ _ _ _ Ev2 Sec2. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope2 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope2::SG2) NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS'' : names_same (Scope1::EE4) (Scope2::SG2) ============================ names_same EE' SG'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS'' : names_same (Scope1::EE4) (Scope'::SG') H4 : forall X L, lookup [] X L -> lookup Scope' X L ============================ names_same EE' SG'
< NS+: case NS''. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 SG' ============================ names_same EE' SG'
< IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 SG' IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE4) ============================ names_same EE' SG'
< case IsEE4+. Subgoal 5.2.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') NS' : names_same EE2 SG' NS1 : names_same ([]::EE2) ([]::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 SG' H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ names_same EE' SG'
< case NS. Subgoal 5.2.8.2: Variables: SF FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope' BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) NS' : names_same EE2 (B::BRest) NS1 : names_same ([]::EE2) ([]::(B::BRest)) H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 (B::BRest) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest ============================ names_same EE' (B::BRest)
< NS_: case NS1. Subgoal 5.2.8.2: Variables: SF FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope' BRest B IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) NS' : names_same EE2 (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) EE2 H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 (B::BRest) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS_2 : names_same EE2 (B::BRest) ============================ names_same EE' (B::BRest)
< case NS_2. Subgoal 5.2.8.2: Variables: SF FE Scope EE EE' O O2 Scope1 EE4 O3 O4 O12 Body Cond Scope' BRest B ARest A IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal (A::ARest) O2 * Ev2 : evalStmt FE ([]::(A::ARest)) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) NS' : names_same (A::ARest) (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS+2 : names_same EE4 (B::BRest) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H12 : names_same ARest BRest ============================ names_same EE' (B::BRest)
< case NS+2. Subgoal 5.2.8.2: Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond Scope' BRest B ARest A ARest1 A1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal (A::ARest) O2 * Ev2 : evalStmt FE ([]::(A::ARest)) Body (Scope1::(A1::ARest1)) O3 * Ev3 : evalStmt FE (A1::ARest1) (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) NS' : names_same (A::ARest) (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H15 : names_same ARest1 BRest ============================ names_same EE' (B::BRest)
< apply IH1 to _ _ _ _ _ _ Ev3 Sec. Subgoal 5.2.8.2: Variables: SF FE Scope EE EE' O O2 Scope1 O3 O4 O12 Body Cond Scope' BRest B ARest A ARest1 A1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsFE : is_list (is_pair is_string (is_pair is_string (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) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) Ev1 : evalExpr FE (Scope::EE) Cond trueVal (A::ARest) O2 * Ev2 : evalStmt FE ([]::(A::ARest)) Body (Scope1::(A1::ARest1)) O3 * Ev3 : evalStmt FE (A1::ARest1) (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) NS' : names_same (A::ARest) (B::BRest) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : forall X L, lookup [] X L -> lookup Scope' X L NS+ : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS+1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H7 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H9 : names_same EE BRest NS_ : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS_1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H11 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H15 : names_same ARest1 BRest H16 : names_same EE' (B::BRest) ============================ names_same EE' (B::BRest)
< search. Subgoal 5.2.9: Variables: SF SG PC SG' FE Scope EE EE' O Body Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.9: Variables: SF SG PC SG' FE Scope EE EE' O Body Cond IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.9.1: Variables: SF SG' FE Scope EE EE' O Body Cond L Scope1 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec : level SF SG' private Cond L Sec1 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ names_same EE' SG'
< apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.9.1: Variables: SF SG' FE Scope EE EE' O Body Cond L Scope1 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec : level SF SG' private Cond L Sec1 : secure SF ([]::SG') private Body (Scope1::SG2) H3 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.9.2: Variables: SF SG' FE Scope EE EE' O Body Cond Scope1 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec : level SF SG' public Cond public Sec1 : secure SF ([]::SG') public Body (Scope1::SG2) ============================ names_same EE' SG'
< apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.9.2: Variables: SF SG' FE Scope EE EE' O Body Cond Scope1 SG2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec : level SF SG' public Cond public Sec1 : secure SF ([]::SG') public Body (Scope1::SG2) H3 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.10: Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Sec : secure SF SG PC (scopeStmt S1) SG' Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.10: Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Sec : secure SF SG PC (scopeStmt S1) SG' Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 ============================ names_same EE' SG'
< apply names_same_add_scope to NS. Subgoal 5.2.10: Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Sec : secure SF SG PC (scopeStmt S1) SG' Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 H2 : names_same ([]::(Scope::EE)) ([]::SG) ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.10: Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 H2 : names_same ([]::(Scope::EE)) ([]::SG') Sec : secure SF ([]::SG') PC S1 (Scope2::SG') ============================ names_same EE' SG'
< NS': apply IH1 to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.10: Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 H2 : names_same ([]::(Scope::EE)) ([]::SG') Sec : secure SF ([]::SG') PC S1 (Scope2::SG') NS' : names_same (Scope1::EE') (Scope2::SG') ============================ names_same EE' SG'
< case NS'. Subgoal 5.2.10: Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 H2 : names_same ([]::(Scope::EE)) ([]::SG') Sec : secure SF ([]::SG') PC S1 (Scope2::SG') H3 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 H4 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 H5 : names_same EE' SG' ============================ names_same EE' SG'
< apply secure_older_scopes to _ _ _ Sec. Subgoal 5.2.10: Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 H2 : names_same ([]::(Scope::EE)) ([]::SG') Sec : secure SF ([]::SG') PC S1 (Scope'::SG') H3 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' H4 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 H5 : names_same EE' SG' H6 : forall X L, lookup [] X L -> lookup Scope' X L ============================ names_same EE' SG'
< search. Subgoal 5.2.11: Variables: SF SG PC SG' FE Scope EE EE' O I O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.11: Variables: SF SG PC SG' FE Scope EE EE' O I O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.11: Variables: SF SG' FE Scope EE EE' O I O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Sec : level SF SG' public E public ============================ names_same EE' SG'
< apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.11: Variables: SF SG' FE Scope EE EE' O I O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : is_expr E Sec : level SF SG' public E public H2 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.12: Variables: SF SG PC SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.12: Variables: SF SG PC SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.12: Variables: SF SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Sec : level SF SG' public E public ============================ names_same EE' SG'
< apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.12: Variables: SF SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : is_expr E Sec : level SF SG' public E public H2 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.13: Variables: SF SG PC SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.13: Variables: SF SG PC SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.13: Variables: SF SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Sec : level SF SG' public E public ============================ names_same EE' SG'
< apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.13: Variables: SF SG' FE Scope EE EE' O O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : is_expr E Sec : level SF SG' public E public H2 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.14: Variables: SF SG PC SG' FE Scope EE EE' O S1 O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ names_same EE' SG'
< case IsS. Subgoal 5.2.14: Variables: SF SG PC SG' FE Scope EE EE' O S1 O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.14: Variables: SF SG' FE Scope EE EE' O S1 O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Sec : level SF SG' public E public ============================ names_same EE' SG'
< apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.14: Variables: SF SG' FE Scope EE EE' O S1 O2 E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : is_expr E Sec : level SF SG' public E public H2 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.2.15: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt (secdecl L Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (secdecl L Ty X E) SG' Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * ============================ names_same (((X, V)::Scope1)::EE2) SG'
< case IsS. Subgoal 5.2.15: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty L IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (secdecl L Ty X E) SG' Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ names_same (((X, V)::Scope1)::EE2) SG'
< Sec: case Sec. Subgoal 5.2.15.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X ============================ names_same (((X, V)::Scope1)::EE2) (((X, private)::Scope2)::SG1)
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.15.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X NS' : names_same (Scope1::EE2) (Scope2::SG1) ============================ names_same (((X, V)::Scope1)::EE2) (((X, private)::Scope2)::SG1)
< R: case NS'. Subgoal 5.2.15.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ names_same (((X, V)::Scope1)::EE2) (((X, private)::Scope2)::SG1)
< unfold . Subgoal 5.2.15.1.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ forall X1 IA, mem (X1, IA) ((X, V)::Scope1) -> exists IB, mem (X1, IB) ((X, private)::Scope2)
< intros M. Subgoal 5.2.15.1.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 X1 IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) ((X, V)::Scope1) ============================ exists IB, mem (X1, IB) ((X, private)::Scope2)
< M: case M. Subgoal 5.2.15.1.1.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ exists IB, mem (X, IB) ((X, private)::Scope2)
< search. Subgoal 5.2.15.1.1.2: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 X1 IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) Scope1 ============================ exists IB, mem (X1, IB) ((X, private)::Scope2)
< apply R to M. Subgoal 5.2.15.1.1.2: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 X1 IA IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) Scope1 H5 : mem (X1, IB) Scope2 ============================ exists IB, mem (X1, IB) ((X, private)::Scope2)
< search. Subgoal 5.2.15.1.2: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ forall X1 IB, mem (X1, IB) ((X, private)::Scope2) -> exists IA, mem (X1, IA) ((X, V)::Scope1)
< intros M. Subgoal 5.2.15.1.2: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 X1 IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) ((X, private)::Scope2) ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< M: case M. Subgoal 5.2.15.1.2.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ exists IA, mem (X, IA) ((X, V)::Scope1)
< search. Subgoal 5.2.15.1.2.2: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 X1 IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) Scope2 ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< apply R1 to M. Subgoal 5.2.15.1.2.2: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 X1 IB IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) Scope2 H5 : mem (X1, IA) Scope1 ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< search. Subgoal 5.2.15.1.3: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ names_same EE2 SG1
< search. Subgoal 5.2.15.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X ============================ names_same (((X, V)::Scope1)::EE2) (((X, public)::Scope2)::SG1)
< NS': apply IH to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.2.15.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X NS' : names_same (Scope1::EE2) (Scope2::SG1) ============================ names_same (((X, V)::Scope1)::EE2) (((X, public)::Scope2)::SG1)
< R: case NS'. Subgoal 5.2.15.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ names_same (((X, V)::Scope1)::EE2) (((X, public)::Scope2)::SG1)
< unfold . Subgoal 5.2.15.2.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ forall X1 IA, mem (X1, IA) ((X, V)::Scope1) -> exists IB, mem (X1, IB) ((X, public)::Scope2)
< intros M. Subgoal 5.2.15.2.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) ((X, V)::Scope1) ============================ exists IB, mem (X1, IB) ((X, public)::Scope2)
< M: case M. Subgoal 5.2.15.2.1.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ exists IB, mem (X, IB) ((X, public)::Scope2)
< search. Subgoal 5.2.15.2.1.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) Scope1 ============================ exists IB, mem (X1, IB) ((X, public)::Scope2)
< apply R to M. Subgoal 5.2.15.2.1.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IA IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IA) Scope1 H5 : mem (X1, IB) Scope2 ============================ exists IB, mem (X1, IB) ((X, public)::Scope2)
< search. Subgoal 5.2.15.2.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ forall X1 IB, mem (X1, IB) ((X, public)::Scope2) -> exists IA, mem (X1, IA) ((X, V)::Scope1)
< intros M. Subgoal 5.2.15.2.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) ((X, public)::Scope2) ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< M: case M. Subgoal 5.2.15.2.2.1: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ exists IA, mem (X, IA) ((X, V)::Scope1)
< search. Subgoal 5.2.15.2.2.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IB IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) Scope2 ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< apply R1 to M. Subgoal 5.2.15.2.2.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 X1 IB IA IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 M : mem (X1, IB) Scope2 H5 : mem (X1, IA) Scope1 ============================ exists IA, mem (X1, IA) ((X, V)::Scope1)
< search. Subgoal 5.2.15.2.3: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X R : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope2 R1 : forall X IB, mem (X, IB) Scope2 -> exists IA, mem (X, IA) Scope1 R2 : names_same EE2 SG1 ============================ names_same EE2 SG1
< search. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Sec : secure SF SG PC <unknown K evalStmt> SG' Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * ============================ names_same EE' SG'
< Sec: case Sec. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' ============================ names_same EE' SG'
< apply names_is to _ Ev1. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names ============================ names_same EE' SG'
< apply names_is_sec to _ Sec. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ names_same EE' SG'
< apply proj_stmt_unique to Sec1 Ev2 _ _ _ _ _. Subgoal 5.2.16.1: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.2.16.1: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NS Ev1 Sec M. Subgoal 5.2.16.1: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.2.16.2: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.2.16.2: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NS Ev1 Sec M. Subgoal 5.2.16.2: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ names_same EE' SG'
< apply proj_stmt_is to Sec1 _ _. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P ============================ names_same EE' SG'
< NS': apply IH1 to _ _ _ _ _ _ Ev3 Sec2. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' ============================ names_same EE' SG'
< EvP: apply proj_evalStmt_forward to Ev2 Ev1 _ _ _ Ev. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 EE'' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' EvP : evalStmt FE (Scope::EE) S_P EE'' O EvP1 : scopes_same EE' EE'' ============================ names_same EE' SG'
< apply evalStmt_unique to _ _ _ EvP Ev3. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O_P @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' EvP : evalStmt FE (Scope::EE) S_P EE_P O_P EvP1 : scopes_same EE' EE_P ============================ names_same EE' SG'
< apply evalStmt_isCtx to _ _ _ Ev. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O_P @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' EvP : evalStmt FE (Scope::EE) S_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' ============================ names_same EE' SG'
< apply evalStmt_isCtx to _ _ _ EvP. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O_P @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' EvP : evalStmt FE (Scope::EE) S_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' H5 : is_list (is_list (is_pair is_string is_value)) EE_P ============================ names_same EE' SG'
< SS: apply scopes_same_symm to EvP1. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O_P @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' EvP : evalStmt FE (Scope::EE) S_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' H5 : is_list (is_list (is_pair is_string is_value)) EE_P SS : scopes_same EE_P EE' ============================ names_same EE' SG'
< apply names_same_scopes_same to _ _ NS' SS. Subgoal 5.2.16: Variables: SF SG PC SG' FE Scope EE EE' Names S_P EE_P O_P Names1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O_P @ Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' EvP : evalStmt FE (Scope::EE) S_P EE_P O_P EvP1 : scopes_same EE' EE_P H4 : is_list (is_list (is_pair is_string is_value)) EE' H5 : is_list (is_list (is_pair is_string is_value)) EE_P SS : scopes_same EE_P EE' H6 : names_same EE' SG' ============================ names_same EE' SG'
< search. Subgoal 5.3.1: Variables: SF SG PC L FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalArgs FE EE' nilArgs [] EE' [] @ Lev : levelArgs SF SG PC nilArgs L ============================ names_same EE' SG
< case Lev. Subgoal 5.3.1: Variables: SF SG PC FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalArgs FE EE' nilArgs [] EE' [] @ ============================ names_same EE' SG
< search. Subgoal 5.3.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsA : is_args (consArgs E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Lev : levelArgs SF SG PC (consArgs E Rest) L Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsA. Subgoal 5.3.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Lev : levelArgs SF SG PC (consArgs E Rest) L Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 H3 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply IH2 to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.3.3: Variables: SF SG PC L FE EE V EE' O IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsA : is_args <unknown K evalArgs> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE <unknown K evalArgs> V EE' O @ Lev : levelArgs SF SG PC <unknown K evalArgs> L ============================ names_same EE' SG
< case Lev. Subgoal 5.4.1: Variables: SF SG PC L FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ Lev : levelRecFields SF SG PC nilRecFieldExprs L ============================ names_same EE' SG
< case Lev. Subgoal 5.4.1: Variables: SF SG PC FE EE' IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ ============================ names_same EE' SG
< search. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE' SG
< case IsRF. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ names_same EE' SG
< Lev: case Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L ============================ names_same EE' SG
< apply IH to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L H4 : names_same EE3 SG ============================ names_same EE' SG
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L H4 : names_same EE3 SG H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE' SG
< apply IH3 to _ _ _ _ _ _ Ev2 Lev1. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L H4 : names_same EE3 SG H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : names_same EE' SG ============================ names_same EE' SG
< search. Subgoal 5.4.3: Variables: SF SG PC L FE EE V EE' O IH : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> names_same EE' SG IH1 : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> names_same EE' SG' IH2 : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> names_same EE' SG IH3 : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> names_same EE' SG IsRF : is_recFieldExprs <unknown K evalRecFields> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE <unknown K evalRecFields> V EE' O @ Lev : levelRecFields SF SG PC <unknown K evalRecFields> L ============================ names_same EE' SG
< case Lev. Proof completed.
< Define public_equiv : (list (list (pair (string) slev))) -> (list (list (pair (string) value))) -> (list (list (pair (string) value))) -> prop by public_equiv [] [] []; public_equiv (SScope::S) (Scope1::G1) (Scope2::G2) := ((forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V) /\ (forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V)) /\ public_equiv S G1 G2.
< Theorem no_lookup_names_same : forall A B X, is_list (is_pair is_string is_value) B -> (forall X IB, mem (X, IB) B -> exists (IA : value), mem (X, IA) A) -> no_lookup A X -> no_lookup B X. ============================ forall A B X, is_list (is_pair is_string is_value) B -> (forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A) -> no_lookup A X -> no_lookup B X
< induction on 1. IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A) -> no_lookup A X -> no_lookup B X ============================ forall A B X, is_list (is_pair is_string is_value) B @ -> (forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A) -> no_lookup A X -> no_lookup B X
< intros IsB MBA NA. Variables: A B X IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A) -> no_lookup A X -> no_lookup B X IsB : is_list (is_pair is_string is_value) B @ MBA : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NA : no_lookup A X ============================ no_lookup B X
< IsB: case IsB. Subgoal 1: Variables: A X IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) A NA : no_lookup A X ============================ no_lookup [] X
< search. Subgoal 2: Variables: A X T H IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) (H::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB : is_pair is_string is_value H IsB1 : is_list (is_pair is_string is_value) T * ============================ no_lookup (H::T) X
< case IsB. Subgoal 2: Variables: A X T B1 A1 IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 ============================ no_lookup ((A1, B1)::T) X
< MA: apply MBA to _ with X = A1. Subgoal 2: Variables: A X T B1 A1 IA IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A ============================ no_lookup ((A1, B1)::T) X
< assert A1 = X -> false. Subgoal 2.1: Variables: A X T B1 A1 IA IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A ============================ A1 = X -> false
< intros E. Subgoal 2.1: Variables: A X T B1 A1 IA IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A E : A1 = X ============================ false
< case E. Subgoal 2.1: Variables: A X T B1 IA IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X1 IB, mem (X1, IB) ((X, B1)::T) -> exists IA, mem (X1, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string X H2 : is_value B1 MA : mem (X, IA) A ============================ false
< apply no_lookup_mem to NA MA. Subgoal 2: Variables: A X T B1 A1 IA IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A H3 : A1 = X -> false ============================ no_lookup ((A1, B1)::T) X
< apply IH to IsB1 _ NA. Subgoal 2.2: Variables: A X T B1 A1 IA IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A H3 : A1 = X -> false ============================ forall X1 IB, mem (X1, IB) T -> exists IA, mem (X1, IA) A
< intros M. Subgoal 2.2: Variables: A X T B1 A1 IA X1 IB IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A H3 : A1 = X -> false M : mem (X1, IB) T ============================ exists IA, mem (X1, IA) A
< MT: assert mem (X1, IB) ((A1, B1)::T). Subgoal 2.2: Variables: A X T B1 A1 IA X1 IB IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A H3 : A1 = X -> false M : mem (X1, IB) T MT : mem (X1, IB) ((A1, B1)::T) ============================ exists IA, mem (X1, IA) A
< apply MBA to MT. Subgoal 2.2: Variables: A X T B1 A1 IA X1 IB IA1 IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A H3 : A1 = X -> false M : mem (X1, IB) T MT : mem (X1, IB) ((A1, B1)::T) H4 : mem (X1, IA1) A ============================ exists IA, mem (X1, IA) A
< search. Subgoal 2: Variables: A X T B1 A1 IA IH : forall A B X, is_list (is_pair is_string is_value) B * -> (forall X1 IB, mem (X1, IB) B -> exists IA, mem (X1, IA) A) -> no_lookup A X -> no_lookup B X MBA : forall X IB, mem (X, IB) ((A1, B1)::T) -> exists IA, mem (X, IA) A NA : no_lookup A X IsB1 : is_list (is_pair is_string is_value) T * H1 : is_string A1 H2 : is_value B1 MA : mem (A1, IA) A H3 : A1 = X -> false H4 : no_lookup T X ============================ no_lookup ((A1, B1)::T) X
< search. Proof completed.
< Theorem public_equiv_lookupScopes : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public -> lookupScopes X G1 V -> lookupScopes X G2 V. ============================ forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public -> lookupScopes X G1 V -> lookupScopes X G2 V
< induction on 5. IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V ============================ forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public @ -> lookupScopes X G1 V -> lookupScopes X G2 V
< intros PE NSA NSB IsB LSS LS. Variables: S G1 G2 X V IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V PE : public_equiv S G1 G2 NSA : names_same G1 S NSB : names_same G2 S IsB : is_list (is_list (is_pair is_string is_value)) G2 LSS : lookupScopes X S public @ LS : lookupScopes X G1 V ============================ lookupScopes X G2 V
< LSS: case LSS. Subgoal 1: Variables: G1 G2 X V Rest L IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V PE : public_equiv (L::Rest) G1 G2 NSA : names_same G1 (L::Rest) NSB : names_same G2 (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) G2 LS : lookupScopes X G1 V LSS : lookup L X public ============================ lookupScopes X G2 V
< PE: case PE. Subgoal 1: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LS : lookupScopes X (Scope1::G3) V LSS : lookup L X public PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 ============================ lookupScopes X (Scope2::G4) V
< LS: case LS. Subgoal 1.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : lookup L X public PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V ============================ lookupScopes X (Scope2::G4) V
< apply PE to LSS LS. Subgoal 1.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : lookup L X public PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V H1 : lookup Scope2 X V ============================ lookupScopes X (Scope2::G4) V
< search. Subgoal 1.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : lookup L X public PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V ============================ lookupScopes X (Scope2::G4) V
< MS: apply lookup_mem to LSS. Subgoal 1.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : lookup L X public PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V MS : mem (X, public) L ============================ lookupScopes X (Scope2::G4) V
< NSA: case NSA. Subgoal 1.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : lookup L X public PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V MS : mem (X, public) L NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest ============================ lookupScopes X (Scope2::G4) V
< MA: apply NSA1 to MS. Subgoal 1.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IA IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : lookup L X public PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V MS : mem (X, public) L NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest MA : mem (X, IA) Scope1 ============================ lookupScopes X (Scope2::G4) V
< apply no_lookup_mem to LS MA. Subgoal 2: Variables: G1 G2 X V Rest L IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V PE : public_equiv (L::Rest) G1 G2 NSA : names_same G1 (L::Rest) NSB : names_same G2 (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) G2 LS : lookupScopes X G1 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * ============================ lookupScopes X G2 V
< PE: case PE. Subgoal 2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LS : lookupScopes X (Scope1::G3) V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 ============================ lookupScopes X (Scope2::G4) V
< LS: case LS. Subgoal 2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V ============================ lookupScopes X (Scope2::G4) V
< MA: apply lookup_mem to LS. Subgoal 2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V MA : mem (X, V) Scope1 ============================ lookupScopes X (Scope2::G4) V
< NSA: case NSA. Subgoal 2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V MA : mem (X, V) Scope1 NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest ============================ lookupScopes X (Scope2::G4) V
< MS: apply NSA to MA. Subgoal 2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IB IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V MA : mem (X, V) Scope1 NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest MS : mem (X, IB) L ============================ lookupScopes X (Scope2::G4) V
< NSB: case NSB. Subgoal 2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IB IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V MA : mem (X, V) Scope1 NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest MS : mem (X, IB) L NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest ============================ lookupScopes X (Scope2::G4) V
< MB: apply NSB1 to MS. Subgoal 2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IB IA IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : lookup Scope1 X V MA : mem (X, V) Scope1 NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest MS : mem (X, IB) L NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest MB : mem (X, IA) Scope2 ============================ lookupScopes X (Scope2::G4) V
< apply no_lookup_mem to LSS MS. Subgoal 2.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSA : names_same (Scope1::G3) (L::Rest) NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V ============================ lookupScopes X (Scope2::G4) V
< NSA: case NSA. Subgoal 2.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V NSB : names_same (Scope2::G4) (L::Rest) IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest ============================ lookupScopes X (Scope2::G4) V
< NSB: case NSB. Subgoal 2.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V IsB : is_list (is_list (is_pair is_string is_value)) (Scope2::G4) LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest ============================ lookupScopes X (Scope2::G4) V
< IsB: case IsB. Subgoal 2.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest IsB : is_list (is_pair is_string is_value) Scope2 IsB1 : is_list (is_list (is_pair is_string is_value)) G4 ============================ lookupScopes X (Scope2::G4) V
< apply IH to PE2 _ _ _ LSS1 LS1. Subgoal 2.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest IsB : is_list (is_pair is_string is_value) Scope2 IsB1 : is_list (is_list (is_pair is_string is_value)) G4 H1 : lookupScopes X G4 V ============================ lookupScopes X (Scope2::G4) V
< apply no_lookup_names_same to IsB _ LS. Subgoal 2.2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest IsB : is_list (is_pair is_string is_value) Scope2 IsB1 : is_list (is_list (is_pair is_string is_value)) G4 H1 : lookupScopes X G4 V ============================ forall X1 IB, mem (X1, IB) Scope2 -> exists IA, mem (X1, IA) Scope1
< intros MB. Subgoal 2.2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 X1 IB IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest IsB : is_list (is_pair is_string is_value) Scope2 IsB1 : is_list (is_list (is_pair is_string is_value)) G4 H1 : lookupScopes X G4 V MB : mem (X1, IB) Scope2 ============================ exists IA, mem (X1, IA) Scope1
< MS: apply NSB to MB. Subgoal 2.2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 X1 IB IB1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest IsB : is_list (is_pair is_string is_value) Scope2 IsB1 : is_list (is_list (is_pair is_string is_value)) G4 H1 : lookupScopes X G4 V MB : mem (X1, IB) Scope2 MS : mem (X1, IB1) L ============================ exists IA, mem (X1, IA) Scope1
< apply NSA1 to MS. Subgoal 2.2.1: Variables: X V Rest L G4 Scope2 G3 Scope1 X1 IB IB1 IA IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest IsB : is_list (is_pair is_string is_value) Scope2 IsB1 : is_list (is_list (is_pair is_string is_value)) G4 H1 : lookupScopes X G4 V MB : mem (X1, IB) Scope2 MS : mem (X1, IB1) L H2 : mem (X1, IA) Scope1 ============================ exists IA, mem (X1, IA) Scope1
< search. Subgoal 2.2: Variables: X V Rest L G4 Scope2 G3 Scope1 IH : forall S G1 G2 X V, public_equiv S G1 G2 -> names_same G1 S -> names_same G2 S -> is_list (is_list (is_pair is_string is_value)) G2 -> lookupScopes X S public * -> lookupScopes X G1 V -> lookupScopes X G2 V LSS : no_lookup L X LSS1 : lookupScopes X Rest public * PE : forall X V, lookup L X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup L X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv Rest G3 G4 LS : no_lookup Scope1 X LS1 : lookupScopes X G3 V NSA : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope1 NSA2 : names_same G3 Rest NSB : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) Scope2 NSB2 : names_same G4 Rest IsB : is_list (is_pair is_string is_value) Scope2 IsB1 : is_list (is_list (is_pair is_string is_value)) G4 H1 : lookupScopes X G4 V H2 : no_lookup Scope2 X ============================ lookupScopes X (Scope2::G4) V
< search. Proof completed.
< Theorem public_equiv_trans : forall SG GA GB GC, public_equiv SG GA GB -> public_equiv SG GB GC -> public_equiv SG GA GC. ============================ forall SG GA GB GC, public_equiv SG GA GB -> public_equiv SG GB GC -> public_equiv SG GA GC
< induction on 1. IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC ============================ forall SG GA GB GC, public_equiv SG GA GB @ -> public_equiv SG GB GC -> public_equiv SG GA GC
< intros PAB PBC. Variables: SG GA GB GC IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : public_equiv SG GA GB @ PBC : public_equiv SG GB GC ============================ public_equiv SG GA GC
< PAB: case PAB. Subgoal 1: Variables: GC IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PBC : public_equiv [] [] GC ============================ public_equiv [] [] GC
< case PBC. Subgoal 1: IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC ============================ public_equiv [] [] []
< search. Subgoal 2: Variables: GC G2 Scope2 G1 Scope1 S SScope IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PBC : public_equiv (SScope::S) (Scope2::G2) GC PAB : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PAB1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PAB2 : public_equiv S G1 G2 * ============================ public_equiv (SScope::S) (Scope1::G1) GC
< PBC: case PBC. Subgoal 2: Variables: G2 Scope2 G1 Scope1 S SScope G4 Scope4 IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PAB1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PAB2 : public_equiv S G1 G2 * PBC : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope4 X V PBC1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope2 X V PBC2 : public_equiv S G2 G4 ============================ public_equiv (SScope::S) (Scope1::G1) (Scope4::G4)
< rename Scope1 to AS. Subgoal 2: Variables: G2 Scope2 G1 AS S SScope G4 Scope4 IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup Scope2 X V PAB1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup AS X V PAB2 : public_equiv S G1 G2 * PBC : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope4 X V PBC1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope2 X V PBC2 : public_equiv S G2 G4 ============================ public_equiv (SScope::S) (AS::G1) (Scope4::G4)
< rename Scope2 to BS. Subgoal 2: Variables: G2 BS G1 AS S SScope G4 Scope4 IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S G1 G2 * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup Scope4 X V PBC1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup BS X V PBC2 : public_equiv S G2 G4 ============================ public_equiv (SScope::S) (AS::G1) (Scope4::G4)
< rename Scope4 to CS. Subgoal 2: Variables: G2 BS G1 AS S SScope G4 CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S G1 G2 * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S G2 G4 ============================ public_equiv (SScope::S) (AS::G1) (CS::G4)
< rename G1 to A. Subgoal 2: Variables: G2 BS A AS S SScope G4 CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A G2 * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S G2 G4 ============================ public_equiv (SScope::S) (AS::A) (CS::G4)
< rename G2 to B. Subgoal 2: Variables: B BS A AS S SScope G4 CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B G4 ============================ public_equiv (SScope::S) (AS::A) (CS::G4)
< rename G4 to C. Subgoal 2: Variables: B BS A AS S SScope C CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C ============================ public_equiv (SScope::S) (AS::A) (CS::C)
< unfold . Subgoal 2.1: Variables: B BS A AS S SScope C CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C ============================ forall X V, lookup SScope X public -> lookup AS X V -> lookup CS X V
< intros LS LA. Subgoal 2.1: Variables: B BS A AS S SScope C CS X V IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C LS : lookup SScope X public LA : lookup AS X V ============================ lookup CS X V
< LB: apply PAB to LS LA. Subgoal 2.1: Variables: B BS A AS S SScope C CS X V IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C LS : lookup SScope X public LA : lookup AS X V LB : lookup BS X V ============================ lookup CS X V
< apply PBC to LS LB. Subgoal 2.1: Variables: B BS A AS S SScope C CS X V IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C LS : lookup SScope X public LA : lookup AS X V LB : lookup BS X V H1 : lookup CS X V ============================ lookup CS X V
< search. Subgoal 2.2: Variables: B BS A AS S SScope C CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C ============================ forall X V, lookup SScope X public -> lookup CS X V -> lookup AS X V
< intros LS LC. Subgoal 2.2: Variables: B BS A AS S SScope C CS X V IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C LS : lookup SScope X public LC : lookup CS X V ============================ lookup AS X V
< LB: apply PBC1 to LS LC. Subgoal 2.2: Variables: B BS A AS S SScope C CS X V IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C LS : lookup SScope X public LC : lookup CS X V LB : lookup BS X V ============================ lookup AS X V
< apply PAB1 to LS LB. Subgoal 2.2: Variables: B BS A AS S SScope C CS X V IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C LS : lookup SScope X public LC : lookup CS X V LB : lookup BS X V H1 : lookup AS X V ============================ lookup AS X V
< search. Subgoal 2.3: Variables: B BS A AS S SScope C CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C ============================ public_equiv S A C
< apply IH to PAB2 PBC2. Subgoal 2.3: Variables: B BS A AS S SScope C CS IH : forall SG GA GB GC, public_equiv SG GA GB * -> public_equiv SG GB GC -> public_equiv SG GA GC PAB : forall X V, lookup SScope X public -> lookup AS X V -> lookup BS X V PAB1 : forall X V, lookup SScope X public -> lookup BS X V -> lookup AS X V PAB2 : public_equiv S A B * PBC : forall X V, lookup SScope X public -> lookup BS X V -> lookup CS X V PBC1 : forall X V, lookup SScope X public -> lookup CS X V -> lookup BS X V PBC2 : public_equiv S B C H1 : public_equiv S A C ============================ public_equiv S A C
< search. Proof completed.
< Theorem public_equiv_refl : forall SG G, names_same G SG -> public_equiv SG G G. ============================ forall SG G, names_same G SG -> public_equiv SG G G
< induction on 1. IH : forall SG G, names_same G SG * -> public_equiv SG G G ============================ forall SG G, names_same G SG @ -> public_equiv SG G G
< intros NS. Variables: SG G IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : names_same G SG @ ============================ public_equiv SG G G
< NS: case NS. Subgoal 1: IH : forall SG G, names_same G SG * -> public_equiv SG G G ============================ public_equiv [] [] []
< search. Subgoal 2: Variables: BRest B ARest A IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NS2 : names_same ARest BRest * ============================ public_equiv (B::BRest) (A::ARest) (A::ARest)
< unfold . Subgoal 2.1: Variables: BRest B ARest A IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NS2 : names_same ARest BRest * ============================ forall X V, lookup B X public -> lookup A X V -> lookup A X V
< intros LPub L. Subgoal 2.1: Variables: BRest B ARest A X V IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NS2 : names_same ARest BRest * LPub : lookup B X public L : lookup A X V ============================ lookup A X V
< search. Subgoal 2.2: Variables: BRest B ARest A IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NS2 : names_same ARest BRest * ============================ forall X V, lookup B X public -> lookup A X V -> lookup A X V
< intros LPub L. Subgoal 2.2: Variables: BRest B ARest A X V IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NS2 : names_same ARest BRest * LPub : lookup B X public L : lookup A X V ============================ lookup A X V
< search. Subgoal 2.3: Variables: BRest B ARest A IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NS2 : names_same ARest BRest * ============================ public_equiv BRest ARest ARest
< apply IH to NS2. Subgoal 2.3: Variables: BRest B ARest A IH : forall SG G, names_same G SG * -> public_equiv SG G G NS : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A NS2 : names_same ARest BRest * H1 : public_equiv BRest ARest ARest ============================ public_equiv BRest ARest ARest
< search. Proof completed.
< Theorem public_equiv_symm : forall SG GA GB, public_equiv SG GA GB -> public_equiv SG GB GA. ============================ forall SG GA GB, public_equiv SG GA GB -> public_equiv SG GB GA
< induction on 1. IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA ============================ forall SG GA GB, public_equiv SG GA GB @ -> public_equiv SG GB GA
< intros PE. Variables: SG GA GB IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA PE : public_equiv SG GA GB @ ============================ public_equiv SG GB GA
< PE: case PE. Subgoal 1: IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA ============================ public_equiv [] [] []
< search. Subgoal 2: Variables: G2 Scope2 G1 Scope1 S SScope IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * ============================ public_equiv (SScope::S) (Scope2::G2) (Scope1::G1)
< unfold . Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * ============================ forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V
< search. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * ============================ forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V
< search. Subgoal 2.3: Variables: G2 Scope2 G1 Scope1 S SScope IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * ============================ public_equiv S G2 G1
< apply IH to PE2. Subgoal 2.3: Variables: G2 Scope2 G1 Scope1 S SScope IH : forall SG GA GB, public_equiv SG GA GB * -> public_equiv SG GB GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * H1 : public_equiv S G2 G1 ============================ public_equiv S G2 G1
< search. Proof completed.
< Theorem public_equiv_scopes_same_snd : forall SG G GA GB, public_equiv SG G GB -> scopes_same GA GB -> public_equiv SG G GA. ============================ forall SG G GA GB, public_equiv SG G GB -> scopes_same GA GB -> public_equiv SG G GA
< induction on 1. IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA ============================ forall SG G GA GB, public_equiv SG G GB @ -> scopes_same GA GB -> public_equiv SG G GA
< intros PE SS. Variables: SG G GA GB IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : public_equiv SG G GB @ SS : scopes_same GA GB ============================ public_equiv SG G GA
< PE: case PE. Subgoal 1: Variables: GA IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA SS : scopes_same GA [] ============================ public_equiv [] [] GA
< case SS. Subgoal 1: IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA ============================ public_equiv [] [] []
< search. Subgoal 2: Variables: GA G2 Scope2 G1 Scope1 S SScope IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA SS : scopes_same GA (Scope2::G2) PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * ============================ public_equiv (SScope::S) (Scope1::G1) GA
< SS: case SS. Subgoal 2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 ============================ public_equiv (SScope::S) (Scope1::G1) (A::ARest)
< unfold . Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 ============================ forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup A X V
< intros LS L1. Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 LS : lookup SScope X public L1 : lookup Scope1 X V ============================ lookup A X V
< L2: apply PE to LS L1. Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 LS : lookup SScope X public L1 : lookup Scope1 X V L2 : lookup Scope2 X V ============================ lookup A X V
< apply SS1 to L2. Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 LS : lookup SScope X public L1 : lookup Scope1 X V L2 : lookup Scope2 X V H1 : lookup A X V ============================ lookup A X V
< search. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 ============================ forall X V, lookup SScope X public -> lookup A X V -> lookup Scope1 X V
< intros LS L2. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 LS : lookup SScope X public L2 : lookup A X V ============================ lookup Scope1 X V
< LS2: apply SS to L2. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 LS : lookup SScope X public L2 : lookup A X V LS2 : lookup Scope2 X V ============================ lookup Scope1 X V
< apply PE1 to LS LS2. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 LS : lookup SScope X public L2 : lookup A X V LS2 : lookup Scope2 X V H1 : lookup Scope1 X V ============================ lookup Scope1 X V
< search. Subgoal 2.3: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 ============================ public_equiv S G1 ARest
< apply IH to PE2 _. Subgoal 2.3: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG G GB * -> scopes_same GA GB -> public_equiv SG G GA PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope2 X V SS1 : forall X V, lookup Scope2 X V -> lookup A X V SS2 : scopes_same ARest G2 H1 : public_equiv S G1 ARest ============================ public_equiv S G1 ARest
< search. Proof completed.
< Theorem public_equiv_scopes_same_fst : forall SG G GA GB, public_equiv SG GB G -> scopes_same GA GB -> public_equiv SG GA G. ============================ forall SG G GA GB, public_equiv SG GB G -> scopes_same GA GB -> public_equiv SG GA G
< induction on 1. IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G ============================ forall SG G GA GB, public_equiv SG GB G @ -> scopes_same GA GB -> public_equiv SG GA G
< intros PE SS. Variables: SG G GA GB IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : public_equiv SG GB G @ SS : scopes_same GA GB ============================ public_equiv SG GA G
< PE: case PE. Subgoal 1: Variables: GA IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G SS : scopes_same GA [] ============================ public_equiv [] GA []
< case SS. Subgoal 1: IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G ============================ public_equiv [] [] []
< search. Subgoal 2: Variables: GA G2 Scope2 G1 Scope1 S SScope IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G SS : scopes_same GA (Scope1::G1) PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * ============================ public_equiv (SScope::S) GA (Scope2::G2)
< SS: case SS. Subgoal 2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 ============================ public_equiv (SScope::S) (A::ARest) (Scope2::G2)
< unfold . Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 ============================ forall X V, lookup SScope X public -> lookup A X V -> lookup Scope2 X V
< intros LS L1. Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 LS : lookup SScope X public L1 : lookup A X V ============================ lookup Scope2 X V
< L: apply SS to L1. Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 LS : lookup SScope X public L1 : lookup A X V L : lookup Scope1 X V ============================ lookup Scope2 X V
< apply PE to LS L. Subgoal 2.1: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 LS : lookup SScope X public L1 : lookup A X V L : lookup Scope1 X V H1 : lookup Scope2 X V ============================ lookup Scope2 X V
< search. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 ============================ forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup A X V
< intros LS L2. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 LS : lookup SScope X public L2 : lookup Scope2 X V ============================ lookup A X V
< L1: apply PE1 to LS L2. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 LS : lookup SScope X public L2 : lookup Scope2 X V L1 : lookup Scope1 X V ============================ lookup A X V
< apply SS1 to L1. Subgoal 2.2: Variables: G2 Scope2 G1 Scope1 S SScope ARest A X V IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 LS : lookup SScope X public L2 : lookup Scope2 X V L1 : lookup Scope1 X V H1 : lookup A X V ============================ lookup A X V
< search. Subgoal 2.3: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 ============================ public_equiv S ARest G2
< apply IH to PE2 _. Subgoal 2.3: Variables: G2 Scope2 G1 Scope1 S SScope ARest A IH : forall SG G GA GB, public_equiv SG GB G * -> scopes_same GA GB -> public_equiv SG GA G PE : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope2 X V PE1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope1 X V PE2 : public_equiv S G1 G2 * SS : forall X V, lookup A X V -> lookup Scope1 X V SS1 : forall X V, lookup Scope1 X V -> lookup A X V SS2 : scopes_same ARest G1 H1 : public_equiv S ARest G2 ============================ public_equiv S ARest G2
< search. Proof completed.
< Theorem public_equiv_add_scope : forall SG GA GB, public_equiv SG GA GB -> public_equiv ([]::SG) ([]::GA) ([]::GB). ============================ forall SG GA GB, public_equiv SG GA GB -> public_equiv ([]::SG) ([]::GA) ([]::GB)
< intros PE. Variables: SG GA GB PE : public_equiv SG GA GB ============================ public_equiv ([]::SG) ([]::GA) ([]::GB)
< unfold . Subgoal 1: Variables: SG GA GB PE : public_equiv SG GA GB ============================ forall X V, lookup [] X public -> lookup [] X V -> lookup [] X V
< intros L. Subgoal 1: Variables: SG GA GB X V PE : public_equiv SG GA GB L : lookup [] X public H1 : lookup [] X V ============================ lookup [] X V
< case L. Subgoal 2: Variables: SG GA GB PE : public_equiv SG GA GB ============================ forall X V, lookup [] X public -> lookup [] X V -> lookup [] X V
< intros L. Subgoal 2: Variables: SG GA GB X V PE : public_equiv SG GA GB L : lookup [] X public H1 : lookup [] X V ============================ lookup [] X V
< case L. Subgoal 3: Variables: SG GA GB PE : public_equiv SG GA GB ============================ public_equiv SG GA GB
< search. Proof completed.
< Theorem public_equiv_add_public : forall SS SG AS GA BS GB X V, public_equiv (SS::SG) (AS::GA) (BS::GB) -> public_equiv (((X, public)::SS)::SG) (((X, V)::AS)::GA) (((X, V)::BS)::GB). ============================ forall SS SG AS GA BS GB X V, public_equiv (SS::SG) (AS::GA) (BS::GB) -> public_equiv (((X, public)::SS)::SG) (((X, V)::AS)::GA) (((X, V)::BS)::GB)
< intros PE. Variables: SS SG AS GA BS GB X V PE : public_equiv (SS::SG) (AS::GA) (BS::GB) ============================ public_equiv (((X, public)::SS)::SG) (((X, V)::AS)::GA) (((X, V)::BS)::GB)
< PE: case PE. Variables: SS SG AS GA BS GB X V PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ public_equiv (((X, public)::SS)::SG) (((X, V)::AS)::GA) (((X, V)::BS)::GB)
< unfold . Subgoal 1: Variables: SS SG AS GA BS GB X V PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ forall X1 V1, lookup ((X, public)::SS) X1 public -> lookup ((X, V)::AS) X1 V1 -> lookup ((X, V)::BS) X1 V1
< intros LS LA. Subgoal 1: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : lookup ((X, public)::SS) X1 public LA : lookup ((X, V)::AS) X1 V1 ============================ lookup ((X, V)::BS) X1 V1
< LS: case LS. Subgoal 1.1: Variables: SS SG AS GA BS GB V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LA : lookup ((X1, V)::AS) X1 V1 ============================ lookup ((X1, V)::BS) X1 V1
< LA: case LA. Subgoal 1.1.1: Variables: SS SG AS GA BS GB X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ lookup ((X1, V1)::BS) X1 V1
< search. Subgoal 1.1.2: Variables: SS SG AS GA BS GB V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LA : X1 = X1 -> false LA1 : lookup AS X1 V1 ============================ lookup ((X1, V)::BS) X1 V1
< apply LA to _. Subgoal 1.2: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LA : lookup ((X, V)::AS) X1 V1 LS : X = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X, V)::BS) X1 V1
< LA: case LA. Subgoal 1.2.1: Variables: SS SG AS GA BS GB X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X1 = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X1, V1)::BS) X1 V1
< apply LS to _. Subgoal 1.2.2: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LA : X = X1 -> false LA1 : lookup AS X1 V1 ============================ lookup ((X, V)::BS) X1 V1
< apply PE to LS1 LA1. Subgoal 1.2.2: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LA : X = X1 -> false LA1 : lookup AS X1 V1 H1 : lookup BS X1 V1 ============================ lookup ((X, V)::BS) X1 V1
< search. Subgoal 2: Variables: SS SG AS GA BS GB X V PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ forall X1 V1, lookup ((X, public)::SS) X1 public -> lookup ((X, V)::BS) X1 V1 -> lookup ((X, V)::AS) X1 V1
< intros LS LB. Subgoal 2: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : lookup ((X, public)::SS) X1 public LB : lookup ((X, V)::BS) X1 V1 ============================ lookup ((X, V)::AS) X1 V1
< LS: case LS. Subgoal 2.1: Variables: SS SG AS GA BS GB V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LB : lookup ((X1, V)::BS) X1 V1 ============================ lookup ((X1, V)::AS) X1 V1
< LB: case LB. Subgoal 2.1.1: Variables: SS SG AS GA BS GB X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ lookup ((X1, V1)::AS) X1 V1
< search. Subgoal 2.1.2: Variables: SS SG AS GA BS GB V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LB : X1 = X1 -> false LB1 : lookup BS X1 V1 ============================ lookup ((X1, V)::AS) X1 V1
< apply LB to _. Subgoal 2.2: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LB : lookup ((X, V)::BS) X1 V1 LS : X = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X, V)::AS) X1 V1
< LB: case LB. Subgoal 2.2.1: Variables: SS SG AS GA BS GB X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X1 = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X1, V1)::AS) X1 V1
< apply LS to _. Subgoal 2.2.2: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LB : X = X1 -> false LB1 : lookup BS X1 V1 ============================ lookup ((X, V)::AS) X1 V1
< apply PE1 to LS1 LB1. Subgoal 2.2.2: Variables: SS SG AS GA BS GB X V X1 V1 PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LB : X = X1 -> false LB1 : lookup BS X1 V1 H1 : lookup AS X1 V1 ============================ lookup ((X, V)::AS) X1 V1
< search. Subgoal 3: Variables: SS SG AS GA BS GB X V PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ public_equiv SG GA GB
< search. Proof completed.
< Theorem public_equiv_add_other : forall SS SG AS GA BS GB X L VA VB, public_equiv (SS::SG) (AS::GA) (BS::GB) -> (L = public -> false) -> public_equiv (((X, L)::SS)::SG) (((X, VA)::AS)::GA) (((X, VB)::BS)::GB). ============================ forall SS SG AS GA BS GB X L VA VB, public_equiv (SS::SG) (AS::GA) (BS::GB) -> (L = public -> false) -> public_equiv (((X, L)::SS)::SG) (((X, VA)::AS)::GA) (((X, VB)::BS)::GB)
< intros PE NEq. Variables: SS SG AS GA BS GB X L VA VB PE : public_equiv (SS::SG) (AS::GA) (BS::GB) NEq : L = public -> false ============================ public_equiv (((X, L)::SS)::SG) (((X, VA)::AS)::GA) (((X, VB)::BS)::GB)
< PE: case PE. Variables: SS SG AS GA BS GB X L VA VB NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ public_equiv (((X, L)::SS)::SG) (((X, VA)::AS)::GA) (((X, VB)::BS)::GB)
< unfold . Subgoal 1: Variables: SS SG AS GA BS GB X L VA VB NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ forall X1 V, lookup ((X, L)::SS) X1 public -> lookup ((X, VA)::AS) X1 V -> lookup ((X, VB)::BS) X1 V
< intros LS LA. Subgoal 1: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : lookup ((X, L)::SS) X1 public LA : lookup ((X, VA)::AS) X1 V ============================ lookup ((X, VB)::BS) X1 V
< LS: case LS. Subgoal 1.1: Variables: SS SG AS GA BS GB VA VB X1 V NEq : public = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LA : lookup ((X1, VA)::AS) X1 V ============================ lookup ((X1, VB)::BS) X1 V
< apply NEq to _. Subgoal 1.2: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LA : lookup ((X, VA)::AS) X1 V LS : X = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X, VB)::BS) X1 V
< LA: case LA. Subgoal 1.2.1: Variables: SS SG AS GA BS GB L VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X1 = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X1, VB)::BS) X1 V
< apply LS to _. Subgoal 1.2.2: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LA : X = X1 -> false LA1 : lookup AS X1 V ============================ lookup ((X, VB)::BS) X1 V
< apply PE to LS1 LA1. Subgoal 1.2.2: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LA : X = X1 -> false LA1 : lookup AS X1 V H1 : lookup BS X1 V ============================ lookup ((X, VB)::BS) X1 V
< search. Subgoal 2: Variables: SS SG AS GA BS GB X L VA VB NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ forall X1 V, lookup ((X, L)::SS) X1 public -> lookup ((X, VB)::BS) X1 V -> lookup ((X, VA)::AS) X1 V
< intros LS LB. Subgoal 2: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : lookup ((X, L)::SS) X1 public LB : lookup ((X, VB)::BS) X1 V ============================ lookup ((X, VA)::AS) X1 V
< LS: case LS. Subgoal 2.1: Variables: SS SG AS GA BS GB VA VB X1 V NEq : public = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LB : lookup ((X1, VB)::BS) X1 V ============================ lookup ((X1, VA)::AS) X1 V
< apply NEq to _. Subgoal 2.2: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LB : lookup ((X, VB)::BS) X1 V LS : X = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X, VA)::AS) X1 V
< LB: case LB. Subgoal 2.2.1: Variables: SS SG AS GA BS GB L VA X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X1 = X1 -> false LS1 : lookup SS X1 public ============================ lookup ((X1, VA)::AS) X1 V
< apply LS to _. Subgoal 2.2.2: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LB : X = X1 -> false LB1 : lookup BS X1 V ============================ lookup ((X, VA)::AS) X1 V
< apply PE1 to LS1 LB1. Subgoal 2.2.2: Variables: SS SG AS GA BS GB X L VA VB X1 V NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB LS : X = X1 -> false LS1 : lookup SS X1 public LB : X = X1 -> false LB1 : lookup BS X1 V H1 : lookup AS X1 V ============================ lookup ((X, VA)::AS) X1 V
< search. Subgoal 3: Variables: SS SG AS GA BS GB X L VA VB NEq : L = public -> false PE : forall X V, lookup SS X public -> lookup AS X V -> lookup BS X V PE1 : forall X V, lookup SS X public -> lookup BS X V -> lookup AS X V PE2 : public_equiv SG GA GB ============================ public_equiv SG GA GB
< search. Proof completed.
< Theorem remove_all_eq_or_mem [Key, Item] : forall L L' (X : Key) (Y : Key) (V : Item), remove_all L X L' -> mem (Y, V) L -> Y = X \/ mem (Y, V) L'. ============================ forall L L' X Y V, remove_all L X L' -> mem (Y, V) L -> Y = X \/ mem (Y, V) L'
< induction on 2. IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' ============================ forall L L' X Y V, remove_all L X L' -> mem (Y, V) L @ -> Y = X \/ mem (Y, V) L'
< intros RA M. Variables: L L' X Y V IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' RA : remove_all L X L' M : mem (Y, V) L @ ============================ Y = X \/ mem (Y, V) L'
< M: case M. Subgoal 1: Variables: L' X Y V Rest IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' RA : remove_all ((Y, V)::Rest) X L' ============================ Y = X \/ mem (Y, V) L'
< RA: case RA. Subgoal 1.1: Variables: L' X V Rest IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' RA : remove_all Rest X L' ============================ X = X \/ mem (X, V) L'
< search. Subgoal 1.2: Variables: X Y V Rest R IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' RA : Y = X -> false RA1 : remove_all Rest X R ============================ Y = X \/ mem (Y, V) ((Y, V)::R)
< search. Subgoal 2: Variables: L' X Y V Rest I IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' RA : remove_all (I::Rest) X L' M : mem (Y, V) Rest * ============================ Y = X \/ mem (Y, V) L'
< RA: case RA. Subgoal 2.1: Variables: L' X Y V Rest Item IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (Y, V) Rest * RA : remove_all Rest X L' ============================ Y = X \/ mem (Y, V) L'
< Or: apply IH to RA M. Subgoal 2.1: Variables: L' X Y V Rest Item IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (Y, V) Rest * RA : remove_all Rest X L' Or : Y = X \/ mem (Y, V) L' ============================ Y = X \/ mem (Y, V) L'
< E: case Or. Subgoal 2.1.1: Variables: L' X V Rest Item IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (X, V) Rest * RA : remove_all Rest X L' ============================ X = X \/ mem (X, V) L'
< search. Subgoal 2.1.2: Variables: L' X Y V Rest Item IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (Y, V) Rest * RA : remove_all Rest X L' E : mem (Y, V) L' ============================ Y = X \/ mem (Y, V) L'
< search. Subgoal 2.2: Variables: X Y V Rest R Item K IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (Y, V) Rest * RA : K = X -> false RA1 : remove_all Rest X R ============================ Y = X \/ mem (Y, V) ((K, Item)::R)
< Or: apply IH to RA1 M. Subgoal 2.2: Variables: X Y V Rest R Item K IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (Y, V) Rest * RA : K = X -> false RA1 : remove_all Rest X R Or : Y = X \/ mem (Y, V) R ============================ Y = X \/ mem (Y, V) ((K, Item)::R)
< E: case Or. Subgoal 2.2.1: Variables: X V Rest R Item K IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (X, V) Rest * RA : K = X -> false RA1 : remove_all Rest X R ============================ X = X \/ mem (X, V) ((K, Item)::R)
< search. Subgoal 2.2.2: Variables: X Y V Rest R Item K IH : forall L L' X Y V, remove_all L X L' -> mem (Y, V) L * -> Y = X \/ mem (Y, V) L' M : mem (Y, V) Rest * RA : K = X -> false RA1 : remove_all Rest X R E : mem (Y, V) R ============================ Y = X \/ mem (Y, V) ((K, Item)::R)
< search. Proof completed.
< Theorem public_equiv_replaceScopes_public : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB. ============================ forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB
< induction on 4. IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB ============================ forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public @ -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB
< intros PE NSA NSB LS RA RB. Variables: SG GA GB X V RA RB IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv SG GA GB NSA : names_same GA SG NSB : names_same GB SG LS : lookupScopes X SG public @ RA : replaceScopes X V GA RA RB : replaceScopes X V GB RB ============================ public_equiv SG RA RB
< LS: case LS. Subgoal 1: Variables: GA GB X V RA RB Rest L IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) GA GB NSA : names_same GA (L::Rest) NSB : names_same GB (L::Rest) RA : replaceScopes X V GA RA RB : replaceScopes X V GB RB LS : lookup L X public ============================ public_equiv (L::Rest) RA RB
< RA: case RA. Subgoal 1.1: Variables: GB X V RB Rest L I Rest1 LRemain L1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) RB
< RB: case RB. Subgoal 1.1.1: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) (((X, V)::LRemain1)::Rest2)
< PE: case PE. Subgoal 1.1.1: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) (((X, V)::LRemain1)::Rest2)
< unfold . Subgoal 1.1.1.1: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ forall X1 V1, lookup L X1 public -> lookup ((X, V)::LRemain) X1 V1 -> lookup ((X, V)::LRemain1) X1 V1
< intros LS LA. Subgoal 1.1.1.1: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LA : lookup ((X, V)::LRemain) X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< LA: case LA. Subgoal 1.1.1.1.1: Variables: Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X1 public RA : mem (X1, I) L1 RA1 : remove_all L1 X1 LRemain RB : mem (X1, I1) L2 RB1 : remove_all L2 X1 LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public ============================ lookup ((X1, V1)::LRemain1) X1 V1
< search. Subgoal 1.1.1.1.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< LA': apply remove_all_lookup_other to RA1 LA1 _. Subgoal 1.1.1.1.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V1 LA' : lookup L1 X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< LB': apply PE to _ LA'. Subgoal 1.1.1.1.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V1 LA' : lookup L1 X1 V1 LB' : lookup L2 X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< apply remove_all_lookup_other_back to RB1 LB' _. Subgoal 1.1.1.1.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V1 LA' : lookup L1 X1 V1 LB' : lookup L2 X1 V1 H1 : lookup LRemain1 X1 V1 ============================ lookup ((X, V)::LRemain1) X1 V1
< search. Subgoal 1.1.1.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ forall X1 V1, lookup L X1 public -> lookup ((X, V)::LRemain1) X1 V1 -> lookup ((X, V)::LRemain) X1 V1
< intros LS LB. Subgoal 1.1.1.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LB : lookup ((X, V)::LRemain1) X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< LB: case LB. Subgoal 1.1.1.2.1: Variables: Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X1 public RA : mem (X1, I) L1 RA1 : remove_all L1 X1 LRemain RB : mem (X1, I1) L2 RB1 : remove_all L2 X1 LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public ============================ lookup ((X1, V1)::LRemain) X1 V1
< search. Subgoal 1.1.1.2.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< LB': apply remove_all_lookup_other to RB1 LB1 _. Subgoal 1.1.1.2.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V1 LB' : lookup L2 X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< LA': apply PE1 to _ LB'. Subgoal 1.1.1.2.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V1 LB' : lookup L2 X1 V1 LA' : lookup L1 X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< apply remove_all_lookup_other_back to RA1 LA' _. Subgoal 1.1.1.2.2: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 X1 V1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 LS1 : lookup L X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V1 LB' : lookup L2 X1 V1 LA' : lookup L1 X1 V1 H1 : lookup LRemain X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< search. Subgoal 1.1.1.3: Variables: X V Rest L I Rest1 LRemain L1 I1 Rest2 LRemain1 L2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : mem (X, I1) L2 RB1 : remove_all L2 X LRemain1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ public_equiv Rest Rest1 Rest2
< search. Subgoal 1.1.2: Variables: X V Rest L I Rest1 LRemain L1 New L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) (L2::New)
< NSA: case NSA. Subgoal 1.1.2: Variables: X V Rest L I Rest1 LRemain L1 New L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) NSB : names_same (L2::Rest2) (L::Rest) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) (L2::New)
< NSB: case NSB. Subgoal 1.1.2: Variables: X V Rest L I Rest1 LRemain L1 New L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest NSB : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L2 NSB2 : names_same Rest2 Rest ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) (L2::New)
< MS: apply NSA to RA. Subgoal 1.1.2: Variables: X V Rest L I Rest1 LRemain L1 New L2 Rest2 IB IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest NSB : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L2 NSB2 : names_same Rest2 Rest MS : mem (X, IB) L ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) (L2::New)
< MB: apply NSB1 to MS. Subgoal 1.1.2: Variables: X V Rest L I Rest1 LRemain L1 New L2 Rest2 IB IA IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) LS : lookup L X public RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest NSB : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L2 NSB2 : names_same Rest2 Rest MS : mem (X, IB) L MB : mem (X, IA) L2 ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) (L2::New)
< apply no_lookup_mem to RB MB. Subgoal 1.2: Variables: GB X V RB Rest L New L1 Rest1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : lookup L X public RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New ============================ public_equiv (L::Rest) (L1::New) RB
< NSA: case NSA. Subgoal 1.2: Variables: GB X V RB Rest L New L1 Rest1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : lookup L X public RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest ============================ public_equiv (L::Rest) (L1::New) RB
< MS: apply lookup_mem to LS. Subgoal 1.2: Variables: GB X V RB Rest L New L1 Rest1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : lookup L X public RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest MS : mem (X, public) L ============================ public_equiv (L::Rest) (L1::New) RB
< MA: apply NSA1 to MS. Subgoal 1.2: Variables: GB X V RB Rest L New L1 Rest1 IA IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : lookup L X public RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest MS : mem (X, public) L MA : mem (X, IA) L1 ============================ public_equiv (L::Rest) (L1::New) RB
< apply no_lookup_mem to RA MA. Subgoal 2: Variables: GA GB X V RA RB Rest L IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) GA GB NSA : names_same GA (L::Rest) NSB : names_same GB (L::Rest) RA : replaceScopes X V GA RA RB : replaceScopes X V GB RB LS : no_lookup L X LS1 : lookupScopes X Rest public * ============================ public_equiv (L::Rest) RA RB
< RA: case RA. Subgoal 2.1: Variables: GB X V RB Rest L I Rest1 LRemain L1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) RB
< NSA: case NSA. Subgoal 2.1: Variables: GB X V RB Rest L I Rest1 LRemain L1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) RB
< MS: apply NSA to RA. Subgoal 2.1: Variables: GB X V RB Rest L I Rest1 LRemain L1 IB IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : mem (X, I) L1 RA1 : remove_all L1 X LRemain NSA : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L NSA1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 NSA2 : names_same Rest1 Rest MS : mem (X, IB) L ============================ public_equiv (L::Rest) (((X, V)::LRemain)::Rest1) RB
< apply no_lookup_mem to LS MS. Subgoal 2.2: Variables: GB X V RB Rest L New L1 Rest1 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) GB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same GB (L::Rest) RB : replaceScopes X V GB RB LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New ============================ public_equiv (L::Rest) (L1::New) RB
< RB: case RB. Subgoal 2.2.1: Variables: X V Rest L New L1 Rest1 I Rest2 LRemain L2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : mem (X, I) L2 RB1 : remove_all L2 X LRemain ============================ public_equiv (L::Rest) (L1::New) (((X, V)::LRemain)::Rest2)
< NSB: case NSB. Subgoal 2.2.1: Variables: X V Rest L New L1 Rest1 I Rest2 LRemain L2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) NSA : names_same (L1::Rest1) (L::Rest) LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : mem (X, I) L2 RB1 : remove_all L2 X LRemain NSB : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L2 NSB2 : names_same Rest2 Rest ============================ public_equiv (L::Rest) (L1::New) (((X, V)::LRemain)::Rest2)
< MS: apply NSB to RB. Subgoal 2.2.1: Variables: X V Rest L New L1 Rest1 I Rest2 LRemain L2 IB IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) NSA : names_same (L1::Rest1) (L::Rest) LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : mem (X, I) L2 RB1 : remove_all L2 X LRemain NSB : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L NSB1 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L2 NSB2 : names_same Rest2 Rest MS : mem (X, IB) L ============================ public_equiv (L::Rest) (L1::New) (((X, V)::LRemain)::Rest2)
< apply no_lookup_mem to LS MS. Subgoal 2.2.2: Variables: X V Rest L New L1 Rest1 New1 L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB PE : public_equiv (L::Rest) (L1::Rest1) (L2::Rest2) NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New1 ============================ public_equiv (L::Rest) (L1::New) (L2::New1)
< PE: case PE. Subgoal 2.2.2: Variables: X V Rest L New L1 Rest1 New1 L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSA : names_same (L1::Rest1) (L::Rest) NSB : names_same (L2::Rest2) (L::Rest) LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ public_equiv (L::Rest) (L1::New) (L2::New1)
< case NSA. Subgoal 2.2.2: Variables: X V Rest L New L1 Rest1 New1 L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB NSB : names_same (L2::Rest2) (L::Rest) LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 H1 : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L H2 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 H3 : names_same Rest1 Rest ============================ public_equiv (L::Rest) (L1::New) (L2::New1)
< case NSB. Subgoal 2.2.2: Variables: X V Rest L New L1 Rest1 New1 L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 H1 : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L H2 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 H3 : names_same Rest1 Rest H4 : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L H5 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L2 H6 : names_same Rest2 Rest ============================ public_equiv (L::Rest) (L1::New) (L2::New1)
< apply IH to PE2 _ _ LS1 RA1 RB1. Subgoal 2.2.2: Variables: X V Rest L New L1 Rest1 New1 L2 Rest2 IH : forall SG GA GB X V RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG public * -> replaceScopes X V GA RA -> replaceScopes X V GB RB -> public_equiv SG RA RB LS : no_lookup L X LS1 : lookupScopes X Rest public * RA : no_lookup L1 X RA1 : replaceScopes X V Rest1 New RB : no_lookup L2 X RB1 : replaceScopes X V Rest2 New1 PE : forall X V, lookup L X public -> lookup L1 X V -> lookup L2 X V PE1 : forall X V, lookup L X public -> lookup L2 X V -> lookup L1 X V PE2 : public_equiv Rest Rest1 Rest2 H1 : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L H2 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L1 H3 : names_same Rest1 Rest H4 : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L H5 : forall X IB, mem (X, IB) L -> exists IA, mem (X, IA) L2 H6 : names_same Rest2 Rest H7 : public_equiv Rest New New1 ============================ public_equiv (L::Rest) (L1::New) (L2::New1)
< search. Proof completed.
< Theorem public_equiv_replaceScopes_other : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB. ============================ forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB
< induction on 4. IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB ============================ forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L @ -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB
< intros PE NSA NSB LS NEq RA RB. Variables: SG GA GB X L VA VB RA RB IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv SG GA GB NSA : names_same GA SG NSB : names_same GB SG LS : lookupScopes X SG L @ NEq : L = public -> false RA : replaceScopes X VA GA RA RB : replaceScopes X VB GB RB ============================ public_equiv SG RA RB
< LS: case LS. Subgoal 1: Variables: GA GB X L VA VB RA RB Rest L1 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) GA GB NSA : names_same GA (L1::Rest) NSB : names_same GB (L1::Rest) NEq : L = public -> false RA : replaceScopes X VA GA RA RB : replaceScopes X VB GB RB LS : lookup L1 X L ============================ public_equiv (L1::Rest) RA RB
< RA: case RA. Subgoal 1.1: Variables: GB X L VA VB RB Rest L1 I Rest1 LRemain L2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) RB
< RB: case RB. Subgoal 1.1.1: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) (((X, VB)::LRemain1)::Rest2)
< PE: case PE. Subgoal 1.1.1: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) (((X, VB)::LRemain1)::Rest2)
< unfold . Subgoal 1.1.1.1: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ forall X1 V, lookup L1 X1 public -> lookup ((X, VA)::LRemain) X1 V -> lookup ((X, VB)::LRemain1) X1 V
< intros LS' LA. Subgoal 1.1.1.1: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LA : lookup ((X, VA)::LRemain) X1 V ============================ lookup ((X, VB)::LRemain1) X1 V
< LA: case LA. Subgoal 1.1.1.1.1: Variables: L VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X1 L RA : mem (X1, I) L2 RA1 : remove_all L2 X1 LRemain RB : mem (X1, I1) L3 RB1 : remove_all L3 X1 LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public ============================ lookup ((X1, VB)::LRemain1) X1 V
< apply lookup_unique to LS' LS. Subgoal 1.1.1.1.1: Variables: VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : public = public -> false LS : lookup L1 X1 public RA : mem (X1, I) L2 RA1 : remove_all L2 X1 LRemain RB : mem (X1, I1) L3 RB1 : remove_all L3 X1 LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public ============================ lookup ((X1, VB)::LRemain1) X1 V
< apply NEq to _. Subgoal 1.1.1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V ============================ lookup ((X, VB)::LRemain1) X1 V
< LA': apply remove_all_lookup_other to RA1 LA1 _. Subgoal 1.1.1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V LA' : lookup L2 X1 V ============================ lookup ((X, VB)::LRemain1) X1 V
< LB': apply PE to _ LA'. Subgoal 1.1.1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V LA' : lookup L2 X1 V LB' : lookup L3 X1 V ============================ lookup ((X, VB)::LRemain1) X1 V
< apply remove_all_lookup_other_back to RB1 LB' _. Subgoal 1.1.1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LA : X = X1 -> false LA1 : lookup LRemain X1 V LA' : lookup L2 X1 V LB' : lookup L3 X1 V H1 : lookup LRemain1 X1 V ============================ lookup ((X, VB)::LRemain1) X1 V
< search. Subgoal 1.1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ forall X1 V, lookup L1 X1 public -> lookup ((X, VB)::LRemain1) X1 V -> lookup ((X, VA)::LRemain) X1 V
< intros LS' LB. Subgoal 1.1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LB : lookup ((X, VB)::LRemain1) X1 V ============================ lookup ((X, VA)::LRemain) X1 V
< LB: case LB. Subgoal 1.1.1.2.1: Variables: L VA Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X1 L RA : mem (X1, I) L2 RA1 : remove_all L2 X1 LRemain RB : mem (X1, I1) L3 RB1 : remove_all L3 X1 LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public ============================ lookup ((X1, VA)::LRemain) X1 V
< apply lookup_unique to LS' LS. Subgoal 1.1.1.2.1: Variables: VA Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : public = public -> false LS : lookup L1 X1 public RA : mem (X1, I) L2 RA1 : remove_all L2 X1 LRemain RB : mem (X1, I1) L3 RB1 : remove_all L3 X1 LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public ============================ lookup ((X1, VA)::LRemain) X1 V
< apply NEq to _. Subgoal 1.1.1.2.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V ============================ lookup ((X, VA)::LRemain) X1 V
< LB': apply remove_all_lookup_other to RB1 LB1 _. Subgoal 1.1.1.2.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V LB' : lookup L3 X1 V ============================ lookup ((X, VA)::LRemain) X1 V
< LA': apply PE1 to _ LB'. Subgoal 1.1.1.2.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V LB' : lookup L3 X1 V LA' : lookup L2 X1 V ============================ lookup ((X, VA)::LRemain) X1 V
< apply remove_all_lookup_other_back to RA1 LA' _. Subgoal 1.1.1.2.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 X1 V IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 LS' : lookup L1 X1 public LB : X = X1 -> false LB1 : lookup LRemain1 X1 V LB' : lookup L3 X1 V LA' : lookup L2 X1 V H1 : lookup LRemain X1 V ============================ lookup ((X, VA)::LRemain) X1 V
< search. Subgoal 1.1.1.3: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 I1 Rest2 LRemain1 L3 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : mem (X, I1) L3 RB1 : remove_all L3 X LRemain1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ public_equiv Rest Rest1 Rest2
< search. Subgoal 1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 New L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) (L3::New)
< NSB: case NSB. Subgoal 1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 New L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NSA : names_same (L2::Rest1) (L1::Rest) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New NSB : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 NSB1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 NSB2 : names_same Rest2 Rest ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) (L3::New)
< NSA: case NSA. Subgoal 1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 New L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New NSB : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 NSB1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 NSB2 : names_same Rest2 Rest NSA : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 NSA1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 NSA2 : names_same Rest1 Rest ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) (L3::New)
< MS: apply NSA to RA. Subgoal 1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 New L3 Rest2 IB IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New NSB : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 NSB1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 NSB2 : names_same Rest2 Rest NSA : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 NSA1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 NSA2 : names_same Rest1 Rest MS : mem (X, IB) L1 ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) (L3::New)
< MB: apply NSB1 to MS. Subgoal 1.1.2: Variables: X L VA VB Rest L1 I Rest1 LRemain L2 New L3 Rest2 IB IA IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NEq : L = public -> false LS : lookup L1 X L RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New NSB : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 NSB1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 NSB2 : names_same Rest2 Rest NSA : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 NSA1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 NSA2 : names_same Rest1 Rest MS : mem (X, IB) L1 MB : mem (X, IA) L3 ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) (L3::New)
< apply no_lookup_mem to RB MB. Subgoal 1.2: Variables: GB X L VA VB RB Rest L1 New L2 Rest1 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : lookup L1 X L RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New ============================ public_equiv (L1::Rest) (L2::New) RB
< MS: apply lookup_mem to LS. Subgoal 1.2: Variables: GB X L VA VB RB Rest L1 New L2 Rest1 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : lookup L1 X L RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New MS : mem (X, L) L1 ============================ public_equiv (L1::Rest) (L2::New) RB
< NSA: case NSA. Subgoal 1.2: Variables: GB X L VA VB RB Rest L1 New L2 Rest1 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : lookup L1 X L RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New MS : mem (X, L) L1 NSA : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 NSA1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 NSA2 : names_same Rest1 Rest ============================ public_equiv (L1::Rest) (L2::New) RB
< MA: apply NSA1 to MS. Subgoal 1.2: Variables: GB X L VA VB RB Rest L1 New L2 Rest1 IA IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : lookup L1 X L RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New MS : mem (X, L) L1 NSA : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 NSA1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 NSA2 : names_same Rest1 Rest MA : mem (X, IA) L2 ============================ public_equiv (L1::Rest) (L2::New) RB
< apply no_lookup_mem to RA MA. Subgoal 2: Variables: GA GB X L VA VB RA RB Rest L1 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) GA GB NSA : names_same GA (L1::Rest) NSB : names_same GB (L1::Rest) NEq : L = public -> false RA : replaceScopes X VA GA RA RB : replaceScopes X VB GB RB LS : no_lookup L1 X LS1 : lookupScopes X Rest L * ============================ public_equiv (L1::Rest) RA RB
< RA: case RA. Subgoal 2.1: Variables: GB X L VA VB RB Rest L1 I Rest1 LRemain L2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) RB
< NSA: case NSA. Subgoal 2.1: Variables: GB X L VA VB RB Rest L1 I Rest1 LRemain L2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain NSA : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 NSA1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 NSA2 : names_same Rest1 Rest ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) RB
< MS: apply NSA to RA. Subgoal 2.1: Variables: GB X L VA VB RB Rest L1 I Rest1 LRemain L2 IB IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : mem (X, I) L2 RA1 : remove_all L2 X LRemain NSA : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 NSA1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 NSA2 : names_same Rest1 Rest MS : mem (X, IB) L1 ============================ public_equiv (L1::Rest) (((X, VA)::LRemain)::Rest1) RB
< apply no_lookup_mem to LS MS. Subgoal 2.2: Variables: GB X L VA VB RB Rest L1 New L2 Rest1 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) GB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same GB (L1::Rest) NEq : L = public -> false RB : replaceScopes X VB GB RB LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New ============================ public_equiv (L1::Rest) (L2::New) RB
< RB: case RB. Subgoal 2.2.1: Variables: X L VA VB Rest L1 New L2 Rest1 I Rest2 LRemain L3 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : mem (X, I) L3 RB1 : remove_all L3 X LRemain ============================ public_equiv (L1::Rest) (L2::New) (((X, VB)::LRemain)::Rest2)
< NSB: case NSB. Subgoal 2.2.1: Variables: X L VA VB Rest L1 New L2 Rest1 I Rest2 LRemain L3 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NSA : names_same (L2::Rest1) (L1::Rest) NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : mem (X, I) L3 RB1 : remove_all L3 X LRemain NSB : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 NSB1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 NSB2 : names_same Rest2 Rest ============================ public_equiv (L1::Rest) (L2::New) (((X, VB)::LRemain)::Rest2)
< MS: apply NSB to RB. Subgoal 2.2.1: Variables: X L VA VB Rest L1 New L2 Rest1 I Rest2 LRemain L3 IB IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NSA : names_same (L2::Rest1) (L1::Rest) NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : mem (X, I) L3 RB1 : remove_all L3 X LRemain NSB : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 NSB1 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 NSB2 : names_same Rest2 Rest MS : mem (X, IB) L1 ============================ public_equiv (L1::Rest) (L2::New) (((X, VB)::LRemain)::Rest2)
< apply no_lookup_mem to LS MS. Subgoal 2.2.2: Variables: X L VA VB Rest L1 New L2 Rest1 New1 L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB PE : public_equiv (L1::Rest) (L2::Rest1) (L3::Rest2) NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New1 ============================ public_equiv (L1::Rest) (L2::New) (L3::New1)
< PE: case PE. Subgoal 2.2.2: Variables: X L VA VB Rest L1 New L2 Rest1 New1 L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSA : names_same (L2::Rest1) (L1::Rest) NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 ============================ public_equiv (L1::Rest) (L2::New) (L3::New1)
< case NSA. Subgoal 2.2.2: Variables: X L VA VB Rest L1 New L2 Rest1 New1 L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NSB : names_same (L3::Rest2) (L1::Rest) NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 H1 : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 H2 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 H3 : names_same Rest1 Rest ============================ public_equiv (L1::Rest) (L2::New) (L3::New1)
< case NSB. Subgoal 2.2.2: Variables: X L VA VB Rest L1 New L2 Rest1 New1 L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 H1 : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 H2 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 H3 : names_same Rest1 Rest H4 : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 H5 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 H6 : names_same Rest2 Rest ============================ public_equiv (L1::Rest) (L2::New) (L3::New1)
< apply IH to _ _ _ LS1 _ RA1 RB1. Subgoal 2.2.2: Variables: X L VA VB Rest L1 New L2 Rest1 New1 L3 Rest2 IH : forall SG GA GB X L VA VB RA RB, public_equiv SG GA GB -> names_same GA SG -> names_same GB SG -> lookupScopes X SG L * -> (L = public -> false) -> replaceScopes X VA GA RA -> replaceScopes X VB GB RB -> public_equiv SG RA RB NEq : L = public -> false LS : no_lookup L1 X LS1 : lookupScopes X Rest L * RA : no_lookup L2 X RA1 : replaceScopes X VA Rest1 New RB : no_lookup L3 X RB1 : replaceScopes X VB Rest2 New1 PE : forall X V, lookup L1 X public -> lookup L2 X V -> lookup L3 X V PE1 : forall X V, lookup L1 X public -> lookup L3 X V -> lookup L2 X V PE2 : public_equiv Rest Rest1 Rest2 H1 : forall X IA, mem (X, IA) L2 -> exists IB, mem (X, IB) L1 H2 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L2 H3 : names_same Rest1 Rest H4 : forall X IA, mem (X, IA) L3 -> exists IB, mem (X, IB) L1 H5 : forall X IB, mem (X, IB) L1 -> exists IA, mem (X, IA) L3 H6 : names_same Rest2 Rest H7 : public_equiv Rest New New1 ============================ public_equiv (L1::Rest) (L2::New) (L3::New1)
< search. Proof completed.
< Theorem replaceScopes_public_equiv : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L'. ============================ forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L'
< induction on 2. IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' ============================ forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' @ -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L'
< intros NS RS LS NEq. Variables: SG L X V L' SL IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NS : names_same L SG RS : replaceScopes X V L L' @ LS : lookupScopes X SG SL NEq : SL = public -> false ============================ public_equiv SG L L'
< RS: case RS. Subgoal 1: Variables: SG X V SL I Rest LRemain L1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NS : names_same (L1::Rest) SG LS : lookupScopes X SG SL NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain ============================ public_equiv SG (L1::Rest) (((X, V)::LRemain)::Rest)
< LS: case LS. Subgoal 1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NS : names_same (L1::Rest) (L2::Rest1) NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL ============================ public_equiv (L2::Rest1) (L1::Rest) (((X, V)::LRemain)::Rest)
< NS: case NS. Subgoal 1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 ============================ public_equiv (L2::Rest1) (L1::Rest) (((X, V)::LRemain)::Rest)
< apply public_equiv_refl to NS2. Subgoal 1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest ============================ public_equiv (L2::Rest1) (L1::Rest) (((X, V)::LRemain)::Rest)
< unfold . Subgoal 1.1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest ============================ forall X1 V1, lookup L2 X1 public -> lookup L1 X1 V1 -> lookup ((X, V)::LRemain) X1 V1
< intros LP LL. Subgoal 1.1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public LL : lookup L1 X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< assert X = X1 -> false. Subgoal 1.1.1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public LL : lookup L1 X1 V1 ============================ X = X1 -> false
< intros E. Subgoal 1.1.1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public LL : lookup L1 X1 V1 E : X = X1 ============================ false
< case E. Subgoal 1.1.1.1: Variables: V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X1, I) L1 RS1 : remove_all L1 X1 LRemain LS : lookup L2 X1 SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public LL : lookup L1 X1 V1 ============================ false
< apply lookup_unique to LS LP. Subgoal 1.1.1.1: Variables: V I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : public = public -> false RS : mem (X1, I) L1 RS1 : remove_all L1 X1 LRemain LS : lookup L2 X1 public NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public LL : lookup L1 X1 V1 ============================ false
< backchain NEq. Subgoal 1.1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public LL : lookup L1 X1 V1 H2 : X = X1 -> false ============================ lookup ((X, V)::LRemain) X1 V1
< apply remove_all_lookup_other_back to RS1 LL _. Subgoal 1.1.1: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public LL : lookup L1 X1 V1 H2 : X = X1 -> false H3 : lookup LRemain X1 V1 ============================ lookup ((X, V)::LRemain) X1 V1
< search. Subgoal 1.1.2: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest ============================ forall X1 V1, lookup L2 X1 public -> lookup ((X, V)::LRemain) X1 V1 -> lookup L1 X1 V1
< intros LP L+. Subgoal 1.1.2: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public L+ : lookup ((X, V)::LRemain) X1 V1 ============================ lookup L1 X1 V1
< L: case L+. Subgoal 1.1.2.1: Variables: SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X1, I) L1 RS1 : remove_all L1 X1 LRemain LS : lookup L2 X1 SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public ============================ lookup L1 X1 V1
< apply lookup_unique to LS LP. Subgoal 1.1.2.1: Variables: I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : public = public -> false RS : mem (X1, I) L1 RS1 : remove_all L1 X1 LRemain LS : lookup L2 X1 public NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public ============================ lookup L1 X1 V1
< apply NEq to _. Subgoal 1.1.2.2: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public L : X = X1 -> false L1 : lookup LRemain X1 V1 ============================ lookup L1 X1 V1
< apply remove_all_lookup_other to RS1 L1 _. Subgoal 1.1.2.2: Variables: X V SL I Rest LRemain L1 Rest1 L2 X1 V1 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest LP : lookup L2 X1 public L : X = X1 -> false L1 : lookup LRemain X1 V1 H2 : lookup L1 X1 V1 ============================ lookup L1 X1 V1
< search. Subgoal 1.1.3: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 H1 : public_equiv Rest1 Rest Rest ============================ public_equiv Rest1 Rest Rest
< search. Subgoal 1.2: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NS : names_same (L1::Rest) (L2::Rest1) NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : no_lookup L2 X LS1 : lookupScopes X Rest1 SL ============================ public_equiv (L2::Rest1) (L1::Rest) (((X, V)::LRemain)::Rest)
< NS: case NS. Subgoal 1.2: Variables: X V SL I Rest LRemain L1 Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : no_lookup L2 X LS1 : lookupScopes X Rest1 SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 ============================ public_equiv (L2::Rest1) (L1::Rest) (((X, V)::LRemain)::Rest)
< MS: apply NS to RS. Subgoal 1.2: Variables: X V SL I Rest LRemain L1 Rest1 L2 IB IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain LS : no_lookup L2 X LS1 : lookupScopes X Rest1 SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 MS : mem (X, IB) L2 ============================ public_equiv (L2::Rest1) (L1::Rest) (((X, V)::LRemain)::Rest)
< apply no_lookup_mem to LS MS. Subgoal 2: Variables: SG X V SL New L1 Rest IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NS : names_same (L1::Rest) SG LS : lookupScopes X SG SL NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * ============================ public_equiv SG (L1::Rest) (L1::New)
< LS: case LS. Subgoal 2.1: Variables: X V SL New L1 Rest Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NS : names_same (L1::Rest) (L2::Rest1) NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * LS : lookup L2 X SL ============================ public_equiv (L2::Rest1) (L1::Rest) (L1::New)
< NS: case NS. Subgoal 2.1: Variables: X V SL New L1 Rest Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 ============================ public_equiv (L2::Rest1) (L1::Rest) (L1::New)
< MS: apply lookup_mem to LS. Subgoal 2.1: Variables: X V SL New L1 Rest Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 MS : mem (X, SL) L2 ============================ public_equiv (L2::Rest1) (L1::Rest) (L1::New)
< ML: apply NS1 to MS. Subgoal 2.1: Variables: X V SL New L1 Rest Rest1 L2 IA IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * LS : lookup L2 X SL NS : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 NS1 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 NS2 : names_same Rest Rest1 MS : mem (X, SL) L2 ML : mem (X, IA) L1 ============================ public_equiv (L2::Rest1) (L1::Rest) (L1::New)
< apply no_lookup_mem to RS ML. Subgoal 2.2: Variables: X V SL New L1 Rest Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NS : names_same (L1::Rest) (L2::Rest1) NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * LS : no_lookup L2 X LS1 : lookupScopes X Rest1 SL ============================ public_equiv (L2::Rest1) (L1::Rest) (L1::New)
< case NS. Subgoal 2.2: Variables: X V SL New L1 Rest Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * LS : no_lookup L2 X LS1 : lookupScopes X Rest1 SL H1 : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 H2 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 H3 : names_same Rest Rest1 ============================ public_equiv (L2::Rest1) (L1::Rest) (L1::New)
< apply IH to _ RS1 LS1 _. Subgoal 2.2: Variables: X V SL New L1 Rest Rest1 L2 IH : forall SG L X V L' SL, names_same L SG -> replaceScopes X V L L' * -> lookupScopes X SG SL -> (SL = public -> false) -> public_equiv SG L L' NEq : SL = public -> false RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * LS : no_lookup L2 X LS1 : lookupScopes X Rest1 SL H1 : forall X IA, mem (X, IA) L1 -> exists IB, mem (X, IB) L2 H2 : forall X IB, mem (X, IB) L2 -> exists IA, mem (X, IA) L1 H3 : names_same Rest Rest1 H4 : public_equiv Rest1 Rest New ============================ public_equiv (L2::Rest1) (L1::Rest) (L1::New)
< search. Proof completed.
< Extensible_Theorem stmt_not_public_no_public_change : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (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) -> NS : names_same (Scope::EE) (SScope::SG) -> Ev : evalStmt FE (Scope::EE) S (Scope'::EE') O -> Sec : secure SF (SScope::SG) PC S SG' -> NEq : (PC = public -> false) -> public_equiv SG EE EE' on Ev as IH_S, expr_not_public_no_public_change : forall E SF SG PC L FE EE V EE' O, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> NS : names_same EE SG -> Ev : evalExpr FE EE E V EE' O -> Lev : level SF SG PC E L -> NEq : (PC = public -> false) -> public_equiv SG EE EE' on Ev as IH_E, args_not_public_no_public_change : forall A SF SG PC L FE EE V EE' O, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> NS : names_same EE SG -> Ev : evalArgs FE EE A V EE' O -> Lev : levelArgs SF SG PC A L -> NEq : (PC = public -> false) -> public_equiv SG EE EE' on Ev as IH_A, recFields_not_public_no_public_change : forall RF SF SG PC L FE EE V EE' O, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> NS : names_same EE SG -> Ev : evalRecFields FE EE RF V EE' O -> Lev : levelRecFields SF SG PC RF L -> NEq : (PC = public -> false) -> public_equiv SG EE EE' on Ev as IH_RF. Subgoal 1: Variables: S SF SScope SG PC SG' FE Scope EE Scope' EE' O IsS : is_stmt S IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) S (Scope'::EE') O Sec : secure SF (SScope::SG) PC S SG' NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_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) /\ is_stmt S)
< search. Subgoal 2: Variables: E SF SG PC L FE EE V EE' O IsE : is_expr E IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE E V EE' O Lev : level SF SG PC E L NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 3: Variables: A SF SG PC L FE EE V EE' O IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE A V EE' O Lev : levelArgs SF SG PC A L NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 4: Variables: RF SF SG PC L FE EE V EE' O IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE RF V EE' O Lev : levelRecFields SF SG PC RF L NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 5.1.1: Variables: SF SScope SG PC SG' FE Scope' EE' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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') NS : names_same (Scope'::EE') (SScope::SG) Ev : evalStmt FE (Scope'::EE') noop (Scope'::EE') [] @ Sec : secure SF (SScope::SG) PC noop SG' NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< case Sec. Subgoal 5.1.1: Variables: SF SScope SG PC FE Scope' EE' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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') NS : names_same (Scope'::EE') (SScope::SG) Ev : evalStmt FE (Scope'::EE') noop (Scope'::EE') [] @ NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< case NS. Subgoal 5.1.1: Variables: SF SScope SG PC FE Scope' EE' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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') noop (Scope'::EE') [] @ NEq : PC = public -> false H1 : forall X IA, mem (X, IA) Scope' -> exists IB, mem (X, IB) SScope H2 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) Scope' H3 : names_same EE' SG ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 O3 S2 S1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (seq S1 S2) SG' NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 O3 S2 S1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (seq S1 S2) SG' NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 O3 S2 S1 SG3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' ============================ public_equiv SG EE EE'
< apply secure_older_scopes to _ _ _ Sec. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 O3 S2 S1 Scope'1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L ============================ public_equiv SG EE EE'
< NS': apply secure_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 O3 S2 S1 Scope'1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L NS' : names_same EE3 (Scope'1::SG) ============================ public_equiv SG EE EE'
< case NS' (keep). Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 O3 S2 S1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H5 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H6 : names_same ARest SG ============================ public_equiv SG EE EE'
< PE1: apply IH_S to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 O3 S2 S1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H5 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H6 : names_same ARest SG PE1 : public_equiv SG EE ARest ============================ public_equiv SG EE EE'
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 O3 S2 S1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H5 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H6 : names_same ARest SG PE1 : public_equiv SG EE ARest H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest) ============================ public_equiv SG EE EE'
< apply secure_is to _ _ _ Sec. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 O3 S2 S1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H5 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H6 : names_same ARest SG PE1 : public_equiv SG EE ARest H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H8 : is_list (is_list (is_pair is_string is_slev)) (Scope'1::SG) ============================ public_equiv SG EE EE'
< PE2: apply IH_S to _ _ _ _ _ _ _ Ev2 Sec1 _. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 O3 S2 S1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H5 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H6 : names_same ARest SG PE1 : public_equiv SG EE ARest H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H8 : is_list (is_list (is_pair is_string is_slev)) (Scope'1::SG) PE2 : public_equiv SG ARest EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.1.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 O3 S2 S1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (seq S1 S2) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) O2 * Ev2 : evalStmt FE (A::ARest) S2 (Scope'::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (SScope::SG) PC S1 (Scope'1::SG) Sec1 : secure SF (Scope'1::SG) PC S2 SG' H3 : forall X L, lookup SScope X L -> lookup Scope'1 X L NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H5 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H6 : names_same ARest SG PE1 : public_equiv SG EE ARest H7 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H8 : is_list (is_list (is_pair is_string is_slev)) (Scope'1::SG) PE2 : public_equiv SG ARest EE' H9 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.3: Variables: SF SScope SG PC SG' FE Scope EE EE' O Scope1 V X E Ty IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE') O @ Sec : secure SF (SScope::SG) PC (declare Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.3: Variables: SF SScope SG PC SG' FE Scope EE EE' O Scope1 V X E Ty IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE') O @ Sec : secure SF (SScope::SG) PC (declare Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.3: Variables: SF SScope SG FE Scope EE EE' O Scope1 V X E Ty IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (SScope::SG) public E public Sec1 : no_lookup SScope X ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.4: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V EE3 E X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (assign X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 (Scope'::EE') ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.4: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V EE3 E X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (assign X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 (Scope'::EE') H1 : is_string X H2 : is_expr E ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.4.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 E X L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes X (SScope::SG) private ============================ public_equiv SG EE EE'
< PE: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.4.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 E X L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes X (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) EE3 ============================ public_equiv SG EE EE'
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.4.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 E X L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes X (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) EE3 NS' : names_same EE3 (SScope::SG) ============================ public_equiv SG EE EE'
< PE1: apply replaceScopes_public_equiv to _ Ev2 Sec1 _. Subgoal 5.1.4.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 E X L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes X (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) EE3 NS' : names_same EE3 (SScope::SG) PE1 : public_equiv (SScope::SG) EE3 (Scope'::EE') ============================ public_equiv SG EE EE'
< case NS'. Subgoal 5.1.4.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V E X L ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (A::ARest) O * Ev2 : replaceScopes X V (A::ARest) (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes X (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) (A::ARest) PE1 : public_equiv (SScope::SG) (A::ARest) (Scope'::EE') H3 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) SScope H4 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) A H5 : names_same ARest SG ============================ public_equiv SG EE EE'
< PE2: apply public_equiv_trans to PE PE1. Subgoal 5.1.4.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V E X L ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (A::ARest) O * Ev2 : replaceScopes X V (A::ARest) (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes X (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) (A::ARest) PE1 : public_equiv (SScope::SG) (A::ARest) (Scope'::EE') H3 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) SScope H4 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) A H5 : names_same ARest SG PE2 : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE') ============================ public_equiv SG EE EE'
< case PE2. Subgoal 5.1.4.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V E X L ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (A::ARest) O * Ev2 : replaceScopes X V (A::ARest) (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes X (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) (A::ARest) PE1 : public_equiv (SScope::SG) (A::ARest) (Scope'::EE') H3 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) SScope H4 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) A H5 : names_same ARest SG H6 : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope' X V H7 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope X V H8 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.4.2: Variables: SF SScope SG FE Scope EE Scope' EE' O V EE3 E X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (assign X E) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 (Scope'::EE') H1 : is_string X H2 : is_expr E Sec : level SF (SScope::SG) public E public Sec1 : lookupScopes X (SScope::SG) public ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.5: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V EE3 FieldVals NewVals E Fields Rec IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (recUpdate Rec Fields E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (Scope'::EE') ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.5: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O V EE3 FieldVals NewVals E Fields Rec IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (recUpdate Rec Fields E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.5.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 FieldVals NewVals E Fields Rec L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes Rec (SScope::SG) private ============================ public_equiv SG EE EE'
< PE: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.5.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 FieldVals NewVals E Fields Rec L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes Rec (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) EE3 ============================ public_equiv SG EE EE'
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.5.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 FieldVals NewVals E Fields Rec L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes Rec (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) EE3 NS' : names_same EE3 (SScope::SG) ============================ public_equiv SG EE EE'
< PE1: apply replaceScopes_public_equiv to _ Ev4 Sec1 _. Subgoal 5.1.5.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V EE3 FieldVals NewVals E Fields Rec L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes Rec (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) EE3 NS' : names_same EE3 (SScope::SG) PE1 : public_equiv (SScope::SG) EE3 (Scope'::EE') ============================ public_equiv SG EE EE'
< case NS'. Subgoal 5.1.5.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V FieldVals NewVals E Fields Rec L ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (A::ARest) O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) (A::ARest) (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes Rec (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) (A::ARest) PE1 : public_equiv (SScope::SG) (A::ARest) (Scope'::EE') H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) SScope H5 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) A H6 : names_same ARest SG ============================ public_equiv SG EE EE'
< PE2: apply public_equiv_trans to PE PE1. Subgoal 5.1.5.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V FieldVals NewVals E Fields Rec L ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (A::ARest) O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) (A::ARest) (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes Rec (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) (A::ARest) PE1 : public_equiv (SScope::SG) (A::ARest) (Scope'::EE') H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) SScope H5 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) A H6 : names_same ARest SG PE2 : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE') ============================ public_equiv SG EE EE'
< case PE2. Subgoal 5.1.5.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O V FieldVals NewVals E Fields Rec L ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (A::ARest) O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) (A::ARest) (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) PC E L Sec1 : lookupScopes Rec (SScope::SG) private PE : public_equiv (SScope::SG) (Scope::EE) (A::ARest) PE1 : public_equiv (SScope::SG) (A::ARest) (Scope'::EE') H4 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) SScope H5 : forall X IB, mem (X, IB) SScope -> exists IA, mem (X, IA) A H6 : names_same ARest SG H7 : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope' X V H8 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope X V H9 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.5.2: Variables: SF SScope SG FE Scope EE Scope' EE' O V EE3 FieldVals NewVals E Fields Rec IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 (Scope'::EE') H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF (SScope::SG) public E public Sec1 : lookupScopes Rec (SScope::SG) public ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.6: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.6: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 ============================ public_equiv SG EE EE'
< apply level_is to _ _ _ Sec. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L ============================ public_equiv SG EE EE'
< assert Sl1 = public -> false. Subgoal 5.1.6.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L ============================ Sl1 = public -> false
< intros E. Subgoal 5.1.6.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L E : Sl1 = public ============================ false
< case E. Subgoal 5.1.6.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::(SScope::SG)) public Th SGT Sec3 : secure SF ([]::(SScope::SG)) public El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L ============================ false
< apply join_public to _ _ Sec1. Subgoal 5.1.6.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) public Cond public Sec1 : join public public public Sec2 : secure SF ([]::(SScope::SG)) public Th SGT Sec3 : secure SF ([]::(SScope::SG)) public El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false ============================ public_equiv SG EE EE'
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) ============================ public_equiv SG EE EE'
< apply names_same_add_scope to NS'. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< apply join_is to _ _ Sec1. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : is_slev Sl1 ============================ public_equiv SG EE EE'
< PE2: apply IH_S to _ _ _ _ _ _ _ Ev2 Sec2 _. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : is_slev Sl1 PE2 : public_equiv (SScope::SG) EE3 (Scope'::EE') ============================ public_equiv SG EE EE'
< PE2': case PE2. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF G1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope2::G1) O2 * Ev2 : evalStmt FE ([]::(Scope2::G1)) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) (Scope2::G1) H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same (Scope2::G1) (SScope::SG) H6 : names_same ([]::(Scope2::G1)) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) (Scope2::G1) H8 : is_slev Sl1 PE2' : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope' X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope2 X V PE2'2 : public_equiv SG G1 EE' ============================ public_equiv SG EE EE'
< PE1': case PE1. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF G1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope2::G1) O2 * Ev2 : evalStmt FE ([]::(Scope2::G1)) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same (Scope2::G1) (SScope::SG) H6 : names_same ([]::(Scope2::G1)) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) (Scope2::G1) H8 : is_slev Sl1 PE2' : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope' X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope2 X V PE2'2 : public_equiv SG G1 EE' PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope2 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1'2 PE2'2. Subgoal 5.1.6: Variables: SF SScope SG PC FE Scope EE Scope' EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF G1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope2::G1) O2 * Ev2 : evalStmt FE ([]::(Scope2::G1)) Th (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same (Scope2::G1) (SScope::SG) H6 : names_same ([]::(Scope2::G1)) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) (Scope2::G1) H8 : is_slev Sl1 PE2' : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope' X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope2 X V PE2'2 : public_equiv SG G1 EE' PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope2 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 H9 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.7: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.7: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 ============================ public_equiv SG EE EE'
< apply level_is to _ _ _ Sec. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L ============================ public_equiv SG EE EE'
< assert Sl1 = public -> false. Subgoal 5.1.7.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L ============================ Sl1 = public -> false
< intros E. Subgoal 5.1.7.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L E : Sl1 = public ============================ false
< case E. Subgoal 5.1.7.1: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::(SScope::SG)) public Th SGT Sec3 : secure SF ([]::(SScope::SG)) public El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L ============================ false
< apply join_public to _ _ Sec1. Subgoal 5.1.7.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) public Cond public Sec1 : join public public public Sec2 : secure SF ([]::(SScope::SG)) public Th SGT Sec3 : secure SF ([]::(SScope::SG)) public El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false ============================ public_equiv SG EE EE'
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) ============================ public_equiv SG EE EE'
< apply names_same_add_scope to NS'. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< apply join_is to _ _ Sec1. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : is_slev Sl1 ============================ public_equiv SG EE EE'
< PE2: apply IH_S to _ _ _ _ _ _ _ Ev2 Sec3 _. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) EE3 H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same EE3 (SScope::SG) H6 : names_same ([]::EE3) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : is_slev Sl1 PE2 : public_equiv (SScope::SG) EE3 (Scope'::EE') ============================ public_equiv SG EE EE'
< PE2': case PE2. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF G1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope2::G1) O2 * Ev2 : evalStmt FE ([]::(Scope2::G1)) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF PE1 : public_equiv (SScope::SG) (Scope::EE) (Scope2::G1) H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same (Scope2::G1) (SScope::SG) H6 : names_same ([]::(Scope2::G1)) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) (Scope2::G1) H8 : is_slev Sl1 PE2' : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope' X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope2 X V PE2'2 : public_equiv SG G1 EE' ============================ public_equiv SG EE EE'
< PE1': case PE1. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF G1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope2::G1) O2 * Ev2 : evalStmt FE ([]::(Scope2::G1)) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same (Scope2::G1) (SScope::SG) H6 : names_same ([]::(Scope2::G1)) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) (Scope2::G1) H8 : is_slev Sl1 PE2' : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope' X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope2 X V PE2'2 : public_equiv SG G1 EE' PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope2 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1'2 PE2'2. Subgoal 5.1.7: Variables: SF SScope SG PC FE Scope EE Scope' EE' O O2 Scope1 O3 El Th Cond L Sl1 SGT SGF G1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope2::G1) O2 * Ev2 : evalStmt FE ([]::(Scope2::G1)) El (Scope1::(Scope'::EE')) O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF (SScope::SG) PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::(SScope::SG)) Sl1 Th SGT Sec3 : secure SF ([]::(SScope::SG)) Sl1 El SGF H4 : is_slev L H5 : Sl1 = public -> false NS' : names_same (Scope2::G1) (SScope::SG) H6 : names_same ([]::(Scope2::G1)) ([]::(SScope::SG)) H7 : is_list (is_list (is_pair is_string is_value)) (Scope2::G1) H8 : is_slev Sl1 PE2' : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope' X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope2 X V PE2'2 : public_equiv SG G1 EE' PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope2 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope2 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 H9 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.8: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.8: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ public_equiv SG EE EE'
< Sec: case Sec (keep). Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec1 _. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) PE1 : public_equiv (SScope::SG) (Scope::EE) EE2 ============================ public_equiv SG EE EE'
< apply level_is to _ _ _ Sec1. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) PE1 : public_equiv (SScope::SG) (Scope::EE) EE2 H3 : is_slev L ============================ public_equiv SG EE EE'
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec1. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) PE1 : public_equiv (SScope::SG) (Scope::EE) EE2 H3 : is_slev L NS' : names_same EE2 (SScope::SG) ============================ public_equiv SG EE EE'
< apply names_same_add_scope to NS'. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) PE1 : public_equiv (SScope::SG) (Scope::EE) EE2 H3 : is_slev L NS' : names_same EE2 (SScope::SG) H4 : names_same ([]::EE2) ([]::(SScope::SG)) ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) PE1 : public_equiv (SScope::SG) (Scope::EE) EE2 H3 : is_slev L NS' : names_same EE2 (SScope::SG) H4 : names_same ([]::EE2) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE EE'
< PE2: apply IH_S to _ _ _ _ _ _ _ Ev2 Sec2 _. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) PE1 : public_equiv (SScope::SG) (Scope::EE) EE2 H3 : is_slev L NS' : names_same EE2 (SScope::SG) H4 : names_same ([]::EE2) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) EE2 PE2 : public_equiv (SScope::SG) EE2 EE4 ============================ public_equiv SG EE EE'
< PE2': case PE2. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4 G1 Scope3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) PE1 : public_equiv (SScope::SG) (Scope::EE) (Scope3::G1) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 ============================ public_equiv SG EE EE'
< PE1': case PE1. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4 G1 Scope3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 ============================ public_equiv SG EE EE'
< PE3: apply public_equiv_trans to PE1'2 PE2'2. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4 G1 Scope3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 ============================ public_equiv SG EE EE'
< NS+: apply secure_eval_names_same to _ _ _ _ _ _ Ev2 Sec2. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4 G1 Scope3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 NS+ : names_same (Scope1::(Scope4::G2)) (Scope2::SG2) ============================ public_equiv SG EE EE'
< Is++: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4 G1 Scope3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 NS+ : names_same (Scope1::(Scope4::G2)) (Scope2::SG2) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope1::(Scope4::G2)) ============================ public_equiv SG EE EE'
< case Is++. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L Scope2 SG2 G2 Scope4 G1 Scope3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope2::SG2) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 NS+ : names_same (Scope1::(Scope4::G2)) (Scope2::SG2) H6 : is_list (is_pair is_string is_value) Scope1 H7 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2) ============================ public_equiv SG EE EE'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 G1 Scope3 Scope'1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope'1::(SScope::SG)) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 NS+ : names_same (Scope1::(Scope4::G2)) (Scope'1::(SScope::SG)) H6 : is_list (is_pair is_string is_value) Scope1 H7 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2) H8 : forall X L, lookup [] X L -> lookup Scope'1 X L ============================ public_equiv SG EE EE'
< case NS+. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 G1 Scope3 Scope'1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope'1::(SScope::SG)) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 H6 : is_list (is_pair is_string is_value) Scope1 H7 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2) H8 : forall X L, lookup [] X L -> lookup Scope'1 X L H9 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'1 H10 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) Scope1 H11 : names_same (Scope4::G2) (SScope::SG) ============================ public_equiv SG EE EE'
< PE4: apply IH_S to _ _ _ _ _ _ _ Ev3 Sec _. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 G1 Scope3 Scope'1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope'1::(SScope::SG)) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 H6 : is_list (is_pair is_string is_value) Scope1 H7 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2) H8 : forall X L, lookup [] X L -> lookup Scope'1 X L H9 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'1 H10 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) Scope1 H11 : names_same (Scope4::G2) (SScope::SG) PE4 : public_equiv SG G2 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE3 PE4. Subgoal 5.1.8.1: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 Scope1 O3 O4 O12 Body Cond L G2 Scope4 G1 Scope3 Scope'1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal (Scope3::G1) O2 * Ev2 : evalStmt FE ([]::(Scope3::G1)) Body (Scope1::(Scope4::G2)) O3 * Ev3 : evalStmt FE (Scope4::G2) (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope'1::(SScope::SG)) H3 : is_slev L NS' : names_same (Scope3::G1) (SScope::SG) H4 : names_same ([]::(Scope3::G1)) ([]::(SScope::SG)) H5 : is_list (is_list (is_pair is_string is_value)) (Scope3::G1) PE2' : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope4 X V PE2'1 : forall X V, lookup SScope X public -> lookup Scope4 X V -> lookup Scope3 X V PE2'2 : public_equiv SG G1 G2 PE1' : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope3 X V PE1'1 : forall X V, lookup SScope X public -> lookup Scope3 X V -> lookup Scope X V PE1'2 : public_equiv SG EE G1 PE3 : public_equiv SG EE G2 H6 : is_list (is_pair is_string is_value) Scope1 H7 : is_list (is_list (is_pair is_string is_value)) (Scope4::G2) H8 : forall X L, lookup [] X L -> lookup Scope'1 X L H9 : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope'1 H10 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) Scope1 H11 : names_same (Scope4::G2) (SScope::SG) PE4 : public_equiv SG G2 EE' H12 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.8.2: Variables: SF SScope SG FE Scope EE Scope' EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope2 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) public (while Cond Body) (SScope::SG) NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) (Scope'::EE') O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) public Cond public Sec2 : secure SF ([]::(SScope::SG)) public Body (Scope2::SG2) ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.9: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Body Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope'::EE') O * ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.9: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Body Cond IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope'::EE') O * H1 : is_expr Cond H2 : is_stmt Body ============================ public_equiv SG EE EE'
< Sec: case Sec (keep). Subgoal 5.1.9.1: Variables: SF SScope SG FE Scope EE Scope' EE' O Body Cond L Scope1 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope'::EE') O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope1::SG2) ============================ public_equiv SG EE EE'
< PE: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec1 _. Subgoal 5.1.9.1: Variables: SF SScope SG FE Scope EE Scope' EE' O Body Cond L Scope1 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope'::EE') O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope1::SG2) PE : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE') ============================ public_equiv SG EE EE'
< case PE. Subgoal 5.1.9.1: Variables: SF SScope SG FE Scope EE Scope' EE' O Body Cond L Scope1 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) private (while Cond Body) (SScope::SG) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope'::EE') O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) private Cond L Sec2 : secure SF ([]::(SScope::SG)) private Body (Scope1::SG2) H3 : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope' X V H4 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope X V H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.9.2: Variables: SF SScope SG FE Scope EE Scope' EE' O Body Cond Scope1 SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (while Cond Body) (Scope'::EE') O @ Sec : secure SF (SScope::SG) public (while Cond Body) (SScope::SG) NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal (Scope'::EE') O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (SScope::SG) public Cond public Sec2 : secure SF ([]::(SScope::SG)) public Body (Scope1::SG2) ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.10: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Scope1 S1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (scopeStmt S1) SG' NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::(Scope'::EE')) O * ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.10: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Scope1 S1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (scopeStmt S1) SG' NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::(Scope'::EE')) O * H1 : is_stmt S1 ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.10: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Scope1 S1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::(Scope'::EE')) O * H1 : is_stmt S1 Sec : secure SF ([]::(SScope::SG)) PC S1 (Scope2::(SScope::SG)) ============================ public_equiv SG EE EE'
< apply names_same_add_scope to NS. Subgoal 5.1.10: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Scope1 S1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::(Scope'::EE')) O * H1 : is_stmt S1 Sec : secure SF ([]::(SScope::SG)) PC S1 (Scope2::(SScope::SG)) H2 : names_same ([]::(Scope::EE)) ([]::(SScope::SG)) ============================ public_equiv SG EE EE'
< PE: apply IH_S to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.10: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Scope1 S1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::(Scope'::EE')) O * H1 : is_stmt S1 Sec : secure SF ([]::(SScope::SG)) PC S1 (Scope2::(SScope::SG)) H2 : names_same ([]::(Scope::EE)) ([]::(SScope::SG)) PE : public_equiv (SScope::SG) (Scope::EE) (Scope'::EE') ============================ public_equiv SG EE EE'
< case PE. Subgoal 5.1.10: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Scope1 S1 Scope2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (scopeStmt S1) (Scope'::EE') O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::(Scope'::EE')) O * H1 : is_stmt S1 Sec : secure SF ([]::(SScope::SG)) PC S1 (Scope2::(SScope::SG)) H2 : names_same ([]::(Scope::EE)) ([]::(SScope::SG)) H3 : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope' X V H4 : forall X V, lookup SScope X public -> lookup Scope' X V -> lookup Scope X V H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.11: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O I O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E (intVal I) (Scope'::EE') O2 * Ev2 : O2 ++ [intVal I] = O ============================ public_equiv SG EE EE'
< case Sec. Subgoal 5.1.11: Variables: SF SScope SG FE Scope EE Scope' EE' O I O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E (intVal I) (Scope'::EE') O2 * Ev2 : O2 ++ [intVal I] = O H1 : level SF (SScope::SG) public E public ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.12: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E trueVal (Scope'::EE') O2 * Ev2 : O2 ++ [trueVal] = O ============================ public_equiv SG EE EE'
< case Sec. Subgoal 5.1.12: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E trueVal (Scope'::EE') O2 * Ev2 : O2 ++ [trueVal] = O H1 : level SF (SScope::SG) public E public ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.13: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E falseVal (Scope'::EE') O2 * Ev2 : O2 ++ [falseVal] = O ============================ public_equiv SG EE EE'
< case Sec. Subgoal 5.1.13: Variables: SF SScope SG FE Scope EE Scope' EE' O O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E falseVal (Scope'::EE') O2 * Ev2 : O2 ++ [falseVal] = O H1 : level SF (SScope::SG) public E public ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.14: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O S1 O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) (Scope'::EE') O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ public_equiv SG EE EE'
< case Sec. Subgoal 5.1.14: Variables: SF SScope SG FE Scope EE Scope' EE' O S1 O2 E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (printVal E) (Scope'::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) (Scope'::EE') O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : level SF (SScope::SG) public E public ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.1.15: Variables: SF SScope SG PC SG' FE Scope EE EE' O Scope1 V X E Ty L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt (secdecl L Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope1)::EE') O @ Sec : secure SF (SScope::SG) PC (secdecl L Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * ============================ public_equiv SG EE EE'
< case IsS. Subgoal 5.1.15: Variables: SF SScope SG PC SG' FE Scope EE EE' O Scope1 V X E Ty L IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope1)::EE') O @ Sec : secure SF (SScope::SG) PC (secdecl L Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.15.1: Variables: SF SScope SG PC FE Scope EE EE' O Scope1 V X E Ty L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (SScope::SG) PC E L1 Sec1 : no_lookup SScope X ============================ public_equiv SG EE EE'
< PE: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.15.1: Variables: SF SScope SG PC FE Scope EE EE' O Scope1 V X E Ty L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (SScope::SG) PC E L1 Sec1 : no_lookup SScope X PE : public_equiv (SScope::SG) (Scope::EE) (Scope1::EE') ============================ public_equiv SG EE EE'
< case PE. Subgoal 5.1.15.1: Variables: SF SScope SG PC FE Scope EE EE' O Scope1 V X E Ty L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE') O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (SScope::SG) PC E L1 Sec1 : no_lookup SScope X H5 : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope1 X V H6 : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope X V H7 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.15.2: Variables: SF SScope SG FE Scope EE EE' O Scope1 V X E Ty IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (SScope::SG) public E public Sec1 : no_lookup SScope X ============================ public_equiv SG EE EE'
< PE: apply IH_E to _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.15.2: Variables: SF SScope SG FE Scope EE EE' O Scope1 V X E Ty IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (SScope::SG) public E public Sec1 : no_lookup SScope X PE : public_equiv (SScope::SG) (Scope::EE) (Scope1::EE') ============================ public_equiv SG EE EE'
< case PE. Subgoal 5.1.15.2: Variables: SF SScope SG FE Scope EE EE' O Scope1 V X E Ty IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE') O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE') O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (SScope::SG) public E public Sec1 : no_lookup SScope X H5 : forall X V, lookup SScope X public -> lookup Scope X V -> lookup Scope1 X V H6 : forall X V, lookup SScope X public -> lookup Scope1 X V -> lookup Scope X V H7 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.1.16: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ Sec : secure SF (SScope::SG) PC <unknown K evalStmt> SG' NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * ============================ public_equiv SG EE EE'
< Sec: case Sec. Subgoal 5.1.16: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' ============================ public_equiv SG EE EE'
< apply names_is to _ Ev1. Subgoal 5.1.16: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names ============================ public_equiv SG EE EE'
< apply names_is_sec to _ Sec. Subgoal 5.1.16: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG EE EE'
< apply proj_stmt_unique to Sec1 Ev2 _ _ _ _ _. Subgoal 5.1.16.1: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.1.16.1: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NS Ev1 Sec M. Subgoal 5.1.16.1: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.1.16.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.1.16.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NS Ev1 Sec M. Subgoal 5.1.16.2: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF (SScope::SG) PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.1.16: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG EE EE'
< apply proj_stmt_is to Sec1 _ _. Subgoal 5.1.16: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P ============================ public_equiv SG EE EE'
< NS': apply secure_eval_names_same to _ _ _ _ _ _ Ev3 Sec2. Subgoal 5.1.16: Variables: SF SScope SG PC SG' FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' ============================ public_equiv SG EE EE'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.1.16: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Names S_P EE_P O_P Names1 Scope'1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P (Scope'1::SG) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P (Scope'1::SG) H4 : forall X L, lookup SScope X L -> lookup Scope'1 X L ============================ public_equiv SG EE EE'
< case NS' (keep). Subgoal 5.1.16: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Names S_P O_P Names1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P (Scope'1::SG) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X L, lookup SScope X L -> lookup Scope'1 X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H6 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H7 : names_same ARest SG ============================ public_equiv SG EE EE'
< PE: apply IH_S to _ _ _ _ _ _ _ Ev3 Sec2 _. Subgoal 5.1.16: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Names S_P O_P Names1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P (Scope'1::SG) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X L, lookup SScope X L -> lookup Scope'1 X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H6 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE : public_equiv SG EE ARest ============================ public_equiv SG EE EE'
< SS: apply proj_evalStmt_forward to Ev2 Ev1 _ _ _ Ev. Subgoal 5.1.16: Variables: SF SScope SG PC FE Scope EE Scope' EE' O Names S_P O_P Names1 Scope'1 ARest A EE'' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P (Scope'1::SG) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X L, lookup SScope X L -> lookup Scope'1 X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H6 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE : public_equiv SG EE ARest SS : evalStmt FE (Scope::EE) S_P EE'' O SS1 : scopes_same (Scope'::EE') EE'' ============================ public_equiv SG EE EE'
< apply evalStmt_unique to _ _ _ SS Ev3. Subgoal 5.1.16: Variables: SF SScope SG PC FE Scope EE Scope' EE' Names S_P O_P Names1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O_P @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P (Scope'1::SG) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X L, lookup SScope X L -> lookup Scope'1 X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H6 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE : public_equiv SG EE ARest SS : evalStmt FE (Scope::EE) S_P (A::ARest) O_P SS1 : scopes_same (Scope'::EE') (A::ARest) ============================ public_equiv SG EE EE'
< SS': case SS1. Subgoal 5.1.16: Variables: SF SScope SG PC FE Scope EE Scope' EE' Names S_P O_P Names1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O_P @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P (Scope'1::SG) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X L, lookup SScope X L -> lookup Scope'1 X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H6 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE : public_equiv SG EE ARest SS : evalStmt FE (Scope::EE) S_P (A::ARest) O_P SS' : forall X V, lookup Scope' X V -> lookup A X V SS'1 : forall X V, lookup A X V -> lookup Scope' X V SS'2 : scopes_same EE' ARest ============================ public_equiv SG EE EE'
< apply public_equiv_scopes_same_snd to PE SS'2. Subgoal 5.1.16: Variables: SF SScope SG PC FE Scope EE Scope' EE' Names S_P O_P Names1 Scope'1 ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (SScope::SG) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) NS : names_same (Scope::EE) (SScope::SG) Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> (Scope'::EE') O_P @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) O_P * Sec : names (SScope::SG) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (SScope::SG) PC S_P (Scope'1::SG) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'1::SG) H4 : forall X L, lookup SScope X L -> lookup Scope'1 X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope'1 H6 : forall X IB, mem (X, IB) Scope'1 -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE : public_equiv SG EE ARest SS : evalStmt FE (Scope::EE) S_P (A::ARest) O_P SS' : forall X V, lookup Scope' X V -> lookup A X V SS'1 : forall X V, lookup A X V -> lookup Scope' X V SS'2 : scopes_same EE' ARest H8 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.1: Variables: SF SG PC L FE EE' I IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ Lev : level SF SG PC (num I) L NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (plus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (plus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (minus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (minus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (mult E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (mult E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (div E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (div E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.6: Variables: SF SG PC L FE EE' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' true trueVal EE' [] @ Lev : level SF SG PC true L NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.2.7: Variables: SF SG PC L FE EE' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' false falseVal EE' [] @ Lev : level SF SG PC false L NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< apply level_is to _ _ _ Lev. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ public_equiv SG EE EE'
< apply join_is to _ _ Lev1. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.8.1: Variables: SF SG L FE EE EE' O EE3 O2 O3 E2 E1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' H7 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE EE'
< apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< apply level_is to _ _ _ Lev. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ public_equiv SG EE EE'
< apply join_is to _ _ Lev1. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.10.1: Variables: SF SG L FE EE EE' O EE3 O2 O3 E2 E1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' H7 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE EE'
< apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< apply level_is to _ _ _ Lev. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ public_equiv SG EE EE'
< apply join_is to _ _ Lev1. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.12.1: Variables: SF SG L FE EE EE' O EE3 O2 O3 E2 E1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' H7 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< apply level_is to _ _ _ Lev. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ public_equiv SG EE EE'
< apply join_is to _ _ Lev1. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.13.1: Variables: SF SG L FE EE EE' O EE3 O2 O3 E2 E1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 PE2 : public_equiv SG EE3 EE' H7 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ public_equiv SG EE EE'
< apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L H2 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ public_equiv SG EE EE'
< apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L H2 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.20: Variables: SF SG PC L FE EE' S IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ Lev : level SF SG PC (stringLit S) L NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Lev : level SF SG PC (appString E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Lev : level SF SG PC (appString E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.22: Variables: SF SG PC L FE V EE' X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalExpr FE EE' (name X) V EE' [] @ Lev : level SF SG PC (name X) L NEq : PC = public -> false Ev1 : lookupScopes X EE' V ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.2.23: Variables: SF SG PC L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Lev : level SF SG PC (call Fun Args) L NEq : PC = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.23: Variables: SF SG PC L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Lev : level SF SG PC (call Fun Args) L NEq : PC = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ public_equiv SG EE EE'
< apply IH_A to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.23.2: Variables: SF SG L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : public = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs ============================ public_equiv SG EE EE'
< apply NEq to _. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Lev : level SF SG PC (stmtExpr S E1) L NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Lev : level SF SG PC (stmtExpr S E1) L NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L ============================ public_equiv SG EE EE'
< apply names_same_add_scope to NS. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) ============================ public_equiv SG EE EE'
< NS': apply secure_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same EE3 SG2 ============================ public_equiv SG EE EE'
< apply secure_older_scopes to _ _ _ Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S Scope' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same EE3 (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L ============================ public_equiv SG EE EE'
< case NS' (keep). Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O O2 Scope O3 E1 S Scope' ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S (A::ARest) O2 * Ev2 : evalExpr FE (A::ARest) E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same (A::ARest) (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H7 : names_same ARest SG ============================ public_equiv SG EE EE'
< PE1: apply IH_S to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O O2 Scope O3 E1 S Scope' ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S (A::ARest) O2 * Ev2 : evalExpr FE (A::ARest) E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same (A::ARest) (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE1 : public_equiv SG EE ARest ============================ public_equiv SG EE EE'
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O O2 Scope O3 E1 S Scope' ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S (A::ARest) O2 * Ev2 : evalExpr FE (A::ARest) E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same (A::ARest) (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE1 : public_equiv SG EE ARest H8 : is_list (is_list (is_pair is_string is_value)) (A::ARest) ============================ public_equiv SG EE EE'
< apply secure_is to _ _ _ Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O O2 Scope O3 E1 S Scope' ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S (A::ARest) O2 * Ev2 : evalExpr FE (A::ARest) E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same (A::ARest) (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE1 : public_equiv SG EE ARest H8 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H9 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) ============================ public_equiv SG EE EE'
< PE2: apply IH_E to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O O2 Scope O3 E1 S Scope' ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S (A::ARest) O2 * Ev2 : evalExpr FE (A::ARest) E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same (A::ARest) (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE1 : public_equiv SG EE ARest H8 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H9 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) PE2 : public_equiv (Scope'::SG) (A::ARest) (Scope::EE') ============================ public_equiv SG EE EE'
< PE': case PE2. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O O2 Scope O3 E1 S Scope' ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S (A::ARest) O2 * Ev2 : evalExpr FE (A::ARest) E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same (A::ARest) (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE1 : public_equiv SG EE ARest H8 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H9 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) PE' : forall X V, lookup Scope' X public -> lookup A X V -> lookup Scope X V PE'1 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup A X V PE'2 : public_equiv SG ARest EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE'2. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O O2 Scope O3 E1 S Scope' ARest A IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S (A::ARest) O2 * Ev2 : evalExpr FE (A::ARest) E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE) ([]::SG) NS' : names_same (A::ARest) (Scope'::SG) H4 : forall X L, lookup [] X L -> lookup Scope' X L H5 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H6 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H7 : names_same ARest SG PE1 : public_equiv SG EE ARest H8 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H9 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) PE' : forall X V, lookup Scope' X public -> lookup A X V -> lookup Scope X V PE'1 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup A X V PE'2 : public_equiv SG ARest EE' H10 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' O VF RF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (recBuild RF) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Lev : level SF SG PC (recBuild RF) L NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' O * ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' O VF RF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Lev : level SF SG PC (recBuild RF) L NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' O VF RF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L ============================ public_equiv SG EE EE'
< apply IH_RF to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' O VF RF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L H2 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr (recFieldAccess Rec F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Lev : level SF SG PC (recFieldAccess Rec F) L NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ public_equiv SG EE EE'
< case IsE. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Lev : level SF SG PC (recFieldAccess Rec F) L NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L ============================ public_equiv SG EE EE'
< apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L H3 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Lev : level SF SG PC <unknown K evalExpr> L NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L ============================ public_equiv SG EE EE'
< apply names_is to _ Ev1. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names ============================ public_equiv SG EE EE'
< apply names_is_sec to _ Lev. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG EE EE'
< apply proj_expr_unique to Lev1 Ev2 _ _ _ _ _. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NS Ev1 Lev M. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NS Ev1 Lev M. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG EE EE'
< apply proj_expr_is to Lev1 _ _. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P ============================ public_equiv SG EE EE'
< PE: apply IH_E to _ _ _ _ _ _ _ Ev3 Lev2 _. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P PE : public_equiv SG EE EE_P ============================ public_equiv SG EE EE'
< SS: apply proj_evalExpr_forward to Ev2 Ev1 _ _ _ Ev. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 EE'' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P PE : public_equiv SG EE EE_P SS : evalExpr FE EE E_P V EE'' O SS1 : scopes_same EE' EE'' ============================ public_equiv SG EE EE'
< apply evalExpr_unique to _ _ _ SS Ev3. Subgoal 5.2.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' O_P @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P PE : public_equiv SG EE EE_P SS : evalExpr FE EE E_P V_P EE_P O_P SS1 : scopes_same EE' EE_P ============================ public_equiv SG EE EE'
< apply public_equiv_scopes_same_snd to PE SS1. Subgoal 5.2.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' O_P @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P PE : public_equiv SG EE EE_P SS : evalExpr FE EE E_P V_P EE_P O_P SS1 : scopes_same EE' EE_P H4 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.3.1: Variables: SF SG PC L FE EE' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalArgs FE EE' nilArgs [] EE' [] @ Lev : levelArgs SF SG PC nilArgs L NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.3.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsA : is_args (consArgs E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Lev : levelArgs SF SG PC (consArgs E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsA. Subgoal 5.3.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Lev : levelArgs SF SG PC (consArgs E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_A to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 PE1 : public_equiv SG EE EE3 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H5 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.3.3: Variables: SF SG PC L FE EE V EE' O IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsA : is_args <unknown K evalArgs> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalArgs FE EE <unknown K evalArgs> V EE' O @ Lev : levelArgs SF SG PC <unknown K evalArgs> L NEq : PC = public -> false ============================ public_equiv SG EE EE'
< case Lev. Subgoal 5.4.1: Variables: SF SG PC L FE EE' IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' NS : names_same EE' SG Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ Lev : levelRecFields SF SG PC nilRecFieldExprs L NEq : PC = public -> false ============================ public_equiv SG EE' EE'
< backchain public_equiv_refl. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ public_equiv SG EE EE'
< case IsRF. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ public_equiv SG EE EE'
< Lev: case Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L ============================ public_equiv SG EE EE'
< PE1: apply IH_E to _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L PE1 : public_equiv SG EE EE3 ============================ public_equiv SG EE EE'
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L PE1 : public_equiv SG EE EE3 H4 : names_same EE3 SG ============================ public_equiv SG EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L PE1 : public_equiv SG EE EE3 H4 : names_same EE3 SG H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG EE EE'
< PE2: apply IH_RF to _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L PE1 : public_equiv SG EE EE3 H4 : names_same EE3 SG H5 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' ============================ public_equiv SG EE EE'
< apply public_equiv_trans to PE1 PE2. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L PE1 : public_equiv SG EE EE3 H4 : names_same EE3 SG H5 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv SG EE3 EE' H6 : public_equiv SG EE EE' ============================ public_equiv SG EE EE'
< search. Subgoal 5.4.3: Variables: SF SG PC L FE EE V EE' O IH_S : forall S SF SScope SG PC SG' FE Scope EE Scope' EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) (SScope::SG) -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> names_same (Scope::EE) (SScope::SG) -> evalStmt FE (Scope::EE) S (Scope'::EE') O * -> secure SF (SScope::SG) PC S SG' -> (PC = public -> false) -> public_equiv SG EE EE' IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> public_equiv SG EE EE' IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> public_equiv SG EE EE' IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> public_equiv SG EE EE' IsRF : is_recFieldExprs <unknown K evalRecFields> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Ev : evalRecFields FE EE <unknown K evalRecFields> V EE' O @ Lev : levelRecFields SF SG PC <unknown K evalRecFields> L NEq : PC = public -> false ============================ public_equiv SG EE EE'
< case Lev. Proof completed.
< Theorem while_no_public_change : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O -> public_equiv SG EE EE2. ============================ forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O -> public_equiv SG EE EE2
< induction on 12. IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 ============================ forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O @ -> public_equiv SG EE EE2
< intros IsC IsB IsSF IsSG IsPC IsFE IsEE NS Sec Lev NEq Ev. Variables: SF SG PC SG' L Cond Body FE EE EE2 O IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Sec : secure SF SG PC (while Cond Body) SG' Lev : level SF SG PC Cond L NEq : L = public -> false Ev : evalStmt FE EE (while Cond Body) EE2 O @ ============================ public_equiv SG EE EE2
< Ev: case Ev. Subgoal 1: Variables: SF SG PC SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Sec : secure SF SG PC (while Cond Body) SG' Lev : level SF SG PC Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O ============================ public_equiv SG EE EE2
< Sec: case Sec (keep). Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 L1 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L1 Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ public_equiv SG' EE EE2
< apply level_unique to _ _ _ _ Sec1 Lev. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ public_equiv SG' EE EE2
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev Lev. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' ============================ public_equiv SG' EE EE2
< apply names_same_add_scope to NS'. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') ============================ public_equiv SG' EE EE2
< PE1: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ Ev Sec1 _. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 ============================ public_equiv SG' EE EE2
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE EE2
< PE2: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ Ev1 Sec2 _. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 ============================ public_equiv SG' EE EE2
< PE3: apply public_equiv_trans to PE1 PE2. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 ============================ public_equiv SG' EE EE2
< NS'': apply secure_eval_names_same to _ _ _ _ _ _ Ev1 Sec2. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 NS'' : names_same (Scope::EE4) (Scope1::SG2) ============================ public_equiv SG' EE EE2
< case NS''. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 H4 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope H5 : names_same EE4 SG2 ============================ public_equiv SG' EE EE2
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope' IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' H4 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope H5 : names_same EE4 SG' H6 : forall X L, lookup [] X L -> lookup Scope' X L ============================ public_equiv SG' EE EE2
< IsEE4+: apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope' IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' H4 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope H5 : names_same EE4 SG' H6 : forall X L, lookup [] X L -> lookup Scope' X L IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE4) ============================ public_equiv SG' EE EE2
< case IsEE4+. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope' IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' H4 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope H5 : names_same EE4 SG' H6 : forall X L, lookup [] X L -> lookup Scope' X L H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ public_equiv SG' EE EE2
< PE4: apply IH to _ _ _ _ _ _ _ _ Sec Lev _ Ev2. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope' IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' H4 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope H5 : names_same EE4 SG' H6 : forall X L, lookup [] X L -> lookup Scope' X L H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE4 PE4 : public_equiv SG' EE4 EE2 ============================ public_equiv SG' EE EE2
< apply public_equiv_trans to PE3 PE4. Subgoal 1.1: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope' IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') NS' : names_same EE1 SG' H1 : names_same ([]::EE1) ([]::SG') PE1 : public_equiv SG' EE EE1 H2 : is_list (is_list (is_pair is_string is_value)) EE1 PE2 : public_equiv SG' EE1 EE4 PE3 : public_equiv SG' EE EE4 H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' H4 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope H5 : names_same EE4 SG' H6 : forall X L, lookup [] X L -> lookup Scope' X L H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE4 PE4 : public_equiv SG' EE4 EE2 H9 : public_equiv SG' EE EE2 ============================ public_equiv SG' EE EE2
< search. Subgoal 1.2: Variables: SF SG' L Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' public (while Cond Body) SG' Lev : level SF SG' public Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) ============================ public_equiv SG' EE EE2
< apply level_unique to _ _ _ _ Sec1 Lev. Subgoal 1.2: Variables: SF SG' Cond Body FE EE EE2 O EE1 O2 Scope EE4 O3 O4 O12 Scope1 SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' public (while Cond Body) SG' Lev : level SF SG' public Cond public NEq : public = public -> false Ev : evalExpr FE EE Cond trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) Body (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while Cond Body) EE2 O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) ============================ public_equiv SG' EE EE2
< apply NEq to _. Subgoal 2: Variables: SF SG PC SG' L Cond Body FE EE EE2 O IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG Sec : secure SF SG PC (while Cond Body) SG' Lev : level SF SG PC Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond falseVal EE2 O * ============================ public_equiv SG EE EE2
< Sec: case Sec (keep). Subgoal 2.1: Variables: SF SG' L Cond Body FE EE EE2 O L1 Scope SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond falseVal EE2 O * Sec1 : level SF SG' private Cond L1 Sec2 : secure SF ([]::SG') private Body (Scope::SG2) ============================ public_equiv SG' EE EE2
< apply expr_not_public_no_public_change to _ _ _ _ _ _ _ Ev Sec1 _. Subgoal 2.1: Variables: SF SG' L Cond Body FE EE EE2 O L1 Scope SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' private (while Cond Body) SG' Lev : level SF SG' private Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond falseVal EE2 O * Sec1 : level SF SG' private Cond L1 Sec2 : secure SF ([]::SG') private Body (Scope::SG2) H1 : public_equiv SG' EE EE2 ============================ public_equiv SG' EE EE2
< search. Subgoal 2.2: Variables: SF SG' L Cond Body FE EE EE2 O Scope SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' public (while Cond Body) SG' Lev : level SF SG' public Cond L NEq : L = public -> false Ev : evalExpr FE EE Cond falseVal EE2 O * Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) ============================ public_equiv SG' EE EE2
< apply level_unique to _ _ _ _ Sec1 Lev. Subgoal 2.2: Variables: SF SG' Cond Body FE EE EE2 O Scope SG2 IH : forall SF SG PC SG' L Cond Body FE EE EE2 O, is_expr Cond -> is_stmt Body -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> names_same EE SG -> secure SF SG PC (while Cond Body) SG' -> level SF SG PC Cond L -> (L = public -> false) -> evalStmt FE EE (while Cond Body) EE2 O * -> public_equiv SG EE EE2 IsC : is_expr Cond IsB : is_stmt Body IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE NS : names_same EE SG' Sec : secure SF SG' public (while Cond Body) SG' Lev : level SF SG' public Cond public NEq : public = public -> false Ev : evalExpr FE EE Cond falseVal EE2 O * Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) ============================ public_equiv SG' EE EE2
< apply NEq to _. Proof completed.
< Define level_arg_vals : (list slev) -> (list value) -> (list value) -> prop by level_arg_vals [] [] []; level_arg_vals (public::SRest) (V::ARest) (V::BRest) := level_arg_vals SRest ARest BRest; level_arg_vals (L::SRest) (VA::ARest) (VB::BRest) := (L = public -> false) /\ level_arg_vals SRest ARest BRest.
< Theorem zip_level_arg_vals : forall S A B N ZA ZB ZS, level_arg_vals S A B -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB]. ============================ forall S A B N ZA ZB ZS, level_arg_vals S A B -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB]
< induction on 1. IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ============================ forall S A B N ZA ZB ZS, level_arg_vals S A B @ -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB]
< intros LAV ZA ZB ZS. Variables: S A B N ZA ZB ZS IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals S A B @ ZA : zip N A ZA ZB : zip N B ZB ZS : zip N S ZS ============================ public_equiv [ZS] [ZA] [ZB]
< LAV: case LAV. Subgoal 1: Variables: N ZA ZB ZS IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZA : zip N [] ZA ZB : zip N [] ZB ZS : zip N [] ZS ============================ public_equiv [ZS] [ZA] [ZB]
< case ZA. Subgoal 1: Variables: ZB ZS IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZB : zip [] [] ZB ZS : zip [] [] ZS ============================ public_equiv [ZS] [[]] [ZB]
< case ZB. Subgoal 1: Variables: ZS IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZS : zip [] [] ZS ============================ public_equiv [ZS] [[]] [[]]
< case ZS. Subgoal 1: IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ============================ public_equiv [[]] [[]] [[]]
< unfold . Subgoal 1.1: IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ============================ forall X V, lookup [] X public -> lookup [] X V -> lookup [] X V
< intros L. Subgoal 1.1: Variables: X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] L : lookup [] X public H1 : lookup [] X V ============================ lookup [] X V
< case L. Subgoal 1.2: IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ============================ forall X V, lookup [] X public -> lookup [] X V -> lookup [] X V
< intros L. Subgoal 1.2: Variables: X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] L : lookup [] X public H1 : lookup [] X V ============================ lookup [] X V
< case L. Subgoal 1.3: IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ============================ public_equiv [] [] []
< search. Subgoal 2: Variables: N ZA ZB ZS BRest V ARest SRest IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZA : zip N (V::ARest) ZA ZB : zip N (V::BRest) ZB ZS : zip N (public::SRest) ZS LAV : level_arg_vals SRest ARest BRest * ============================ public_equiv [ZS] [ZA] [ZB]
< ZA: case ZA. Subgoal 2: Variables: ZB ZS BRest V ARest SRest Rest A1 ARest1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZB : zip (A1::ARest1) (V::BRest) ZB ZS : zip (A1::ARest1) (public::SRest) ZS LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ============================ public_equiv [ZS] [(A1, V)::Rest] [ZB]
< ZB: case ZB. Subgoal 2: Variables: ZS BRest V ARest SRest Rest A1 ARest1 Rest1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZS : zip (A1::ARest1) (public::SRest) ZS LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ============================ public_equiv [ZS] [(A1, V)::Rest] [(A1, V)::Rest1]
< ZS: case ZS. Subgoal 2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ public_equiv [(A1, public)::Rest2] [(A1, V)::Rest] [(A1, V)::Rest1]
< unfold . Subgoal 2.1: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ forall X V1, lookup ((A1, public)::Rest2) X public -> lookup ((A1, V)::Rest) X V1 -> lookup ((A1, V)::Rest1) X V1
< intros LS LA. Subgoal 2.1: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : lookup ((A1, public)::Rest2) X public LA : lookup ((A1, V)::Rest) X V1 ============================ lookup ((A1, V)::Rest1) X V1
< LS: case LS. Subgoal 2.1.1: Variables: BRest V ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LA : lookup ((X, V)::Rest) X V1 ============================ lookup ((X, V)::Rest1) X V1
< LA: case LA. Subgoal 2.1.1.1: Variables: BRest ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ lookup ((X, V1)::Rest1) X V1
< search. Subgoal 2.1.1.2: Variables: BRest V ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LA : X = X -> false LA1 : lookup Rest X V1 ============================ lookup ((X, V)::Rest1) X V1
< apply LA to _. Subgoal 2.1.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LA : lookup ((A1, V)::Rest) X V1 LS : A1 = X -> false LS1 : lookup Rest2 X public ============================ lookup ((A1, V)::Rest1) X V1
< LA: case LA. Subgoal 2.1.2.1: Variables: BRest ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : X = X -> false LS1 : lookup Rest2 X public ============================ lookup ((X, V1)::Rest1) X V1
< apply LS to _. Subgoal 2.1.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V1 ============================ lookup ((A1, V)::Rest1) X V1
< PE: apply IH to LAV ZA ZB ZS. Subgoal 2.1.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V1 PE : public_equiv [Rest2] [Rest] [Rest1] ============================ lookup ((A1, V)::Rest1) X V1
< PE: case PE. Subgoal 2.1.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V1 PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] ============================ lookup ((A1, V)::Rest1) X V1
< apply PE to LS1 LA1. Subgoal 2.1.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V1 PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] H1 : lookup Rest1 X V1 ============================ lookup ((A1, V)::Rest1) X V1
< search. Subgoal 2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ forall X V1, lookup ((A1, public)::Rest2) X public -> lookup ((A1, V)::Rest1) X V1 -> lookup ((A1, V)::Rest) X V1
< intros LS LB. Subgoal 2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : lookup ((A1, public)::Rest2) X public LB : lookup ((A1, V)::Rest1) X V1 ============================ lookup ((A1, V)::Rest) X V1
< LS: case LS. Subgoal 2.2.1: Variables: BRest V ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LB : lookup ((X, V)::Rest1) X V1 ============================ lookup ((X, V)::Rest) X V1
< LB: case LB. Subgoal 2.2.1.1: Variables: BRest ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ lookup ((X, V1)::Rest) X V1
< search. Subgoal 2.2.1.2: Variables: BRest V ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LB : X = X -> false LB1 : lookup Rest1 X V1 ============================ lookup ((X, V)::Rest) X V1
< apply LB to _. Subgoal 2.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LB : lookup ((A1, V)::Rest1) X V1 LS : A1 = X -> false LS1 : lookup Rest2 X public ============================ lookup ((A1, V)::Rest) X V1
< LB: case LB. Subgoal 2.2.2.1: Variables: BRest ARest SRest Rest ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : X = X -> false LS1 : lookup Rest2 X public ============================ lookup ((X, V1)::Rest) X V1
< apply LS to _. Subgoal 2.2.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V1 ============================ lookup ((A1, V)::Rest) X V1
< PE: apply IH to LAV ZA ZB ZS. Subgoal 2.2.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V1 PE : public_equiv [Rest2] [Rest] [Rest1] ============================ lookup ((A1, V)::Rest) X V1
< PE: case PE. Subgoal 2.2.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V1 PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] ============================ lookup ((A1, V)::Rest) X V1
< apply PE1 to LS1 LB1. Subgoal 2.2.2.2: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 X V1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V1 PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] H1 : lookup Rest X V1 ============================ lookup ((A1, V)::Rest) X V1
< search. Subgoal 2.3: Variables: BRest V ARest SRest Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ public_equiv [] [] []
< search. Subgoal 3: Variables: N ZA ZB ZS BRest VB ARest VA SRest L IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZA : zip N (VA::ARest) ZA ZB : zip N (VB::BRest) ZB ZS : zip N (L::SRest) ZS LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ============================ public_equiv [ZS] [ZA] [ZB]
< ZA: case ZA. Subgoal 3: Variables: ZB ZS BRest VB ARest VA SRest L Rest A1 ARest1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZB : zip (A1::ARest1) (VB::BRest) ZB ZS : zip (A1::ARest1) (L::SRest) ZS LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ============================ public_equiv [ZS] [(A1, VA)::Rest] [ZB]
< ZB: case ZB. Subgoal 3: Variables: ZS BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] ZS : zip (A1::ARest1) (L::SRest) ZS LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ============================ public_equiv [ZS] [(A1, VA)::Rest] [(A1, VB)::Rest1]
< ZS: case ZS. Subgoal 3: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ public_equiv [(A1, L)::Rest2] [(A1, VA)::Rest] [(A1, VB)::Rest1]
< unfold . Subgoal 3.1: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ forall X V, lookup ((A1, L)::Rest2) X public -> lookup ((A1, VA)::Rest) X V -> lookup ((A1, VB)::Rest1) X V
< intros LS LA. Subgoal 3.1: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : lookup ((A1, L)::Rest2) X public LA : lookup ((A1, VA)::Rest) X V ============================ lookup ((A1, VB)::Rest1) X V
< LS: case LS. Subgoal 3.1.1: Variables: BRest VB ARest VA SRest Rest ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : public = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LA : lookup ((X, VA)::Rest) X V ============================ lookup ((X, VB)::Rest1) X V
< apply LAV to _. Subgoal 3.1.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LA : lookup ((A1, VA)::Rest) X V LS : A1 = X -> false LS1 : lookup Rest2 X public ============================ lookup ((A1, VB)::Rest1) X V
< LA: case LA. Subgoal 3.1.2.1: Variables: BRest VB ARest SRest L Rest ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : X = X -> false LS1 : lookup Rest2 X public ============================ lookup ((X, VB)::Rest1) X V
< apply LS to _. Subgoal 3.1.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V ============================ lookup ((A1, VB)::Rest1) X V
< PE: apply IH to LAV1 ZA ZB ZS. Subgoal 3.1.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V PE : public_equiv [Rest2] [Rest] [Rest1] ============================ lookup ((A1, VB)::Rest1) X V
< PE: case PE. Subgoal 3.1.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] ============================ lookup ((A1, VB)::Rest1) X V
< apply PE to LS1 LA1. Subgoal 3.1.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LA : A1 = X -> false LA1 : lookup Rest X V PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] H1 : lookup Rest1 X V ============================ lookup ((A1, VB)::Rest1) X V
< search. Subgoal 3.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ forall X V, lookup ((A1, L)::Rest2) X public -> lookup ((A1, VB)::Rest1) X V -> lookup ((A1, VA)::Rest) X V
< intros LS LB. Subgoal 3.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : lookup ((A1, L)::Rest2) X public LB : lookup ((A1, VB)::Rest1) X V ============================ lookup ((A1, VA)::Rest) X V
< LS: case LS. Subgoal 3.2.1: Variables: BRest VB ARest VA SRest Rest ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : public = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LB : lookup ((X, VB)::Rest1) X V ============================ lookup ((X, VA)::Rest) X V
< apply LAV to _. Subgoal 3.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LB : lookup ((A1, VB)::Rest1) X V LS : A1 = X -> false LS1 : lookup Rest2 X public ============================ lookup ((A1, VA)::Rest) X V
< LB: case LB. Subgoal 3.2.2.1: Variables: BRest ARest VA SRest L Rest ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : X = X -> false LS1 : lookup Rest2 X public ============================ lookup ((X, VA)::Rest) X V
< apply LS to _. Subgoal 3.2.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V ============================ lookup ((A1, VA)::Rest) X V
< PE: apply IH to LAV1 ZA ZB ZS. Subgoal 3.2.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V PE : public_equiv [Rest2] [Rest] [Rest1] ============================ lookup ((A1, VA)::Rest) X V
< PE: case PE. Subgoal 3.2.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] ============================ lookup ((A1, VA)::Rest) X V
< apply PE1 to LS1 LB1. Subgoal 3.2.2.2: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 X V IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 LS : A1 = X -> false LS1 : lookup Rest2 X public LB : A1 = X -> false LB1 : lookup Rest1 X V PE : forall X V, lookup Rest2 X public -> lookup Rest X V -> lookup Rest1 X V PE1 : forall X V, lookup Rest2 X public -> lookup Rest1 X V -> lookup Rest X V PE2 : public_equiv [] [] [] H1 : lookup Rest X V ============================ lookup ((A1, VA)::Rest) X V
< search. Subgoal 3.3: Variables: BRest VB ARest VA SRest L Rest A1 ARest1 Rest1 Rest2 IH : forall S A B N ZA ZB ZS, level_arg_vals S A B * -> zip N A ZA -> zip N B ZB -> zip N S ZS -> public_equiv [ZS] [ZA] [ZB] LAV : L = public -> false LAV1 : level_arg_vals SRest ARest BRest * ZA : zip ARest1 ARest Rest ZB : zip ARest1 BRest Rest1 ZS : zip ARest1 SRest Rest2 ============================ public_equiv [] [] []
< search. Proof completed.
< Theorem zip_is_sec : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z -> is_list (is_pair is_string is_slev) Z. ============================ forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z -> is_list (is_pair is_string is_slev) Z
< induction on 3. IH : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z * -> is_list (is_pair is_string is_slev) Z ============================ forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z @ -> is_list (is_pair is_string is_slev) Z
< intros IsA IsB Z. Variables: A B Z IH : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z * -> is_list (is_pair is_string is_slev) Z IsA : is_list is_string A IsB : is_list is_slev B Z : zip A B Z @ ============================ is_list (is_pair is_string is_slev) Z
< Z: case Z. Subgoal 1: IH : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z * -> is_list (is_pair is_string is_slev) Z IsA : is_list is_string [] IsB : is_list is_slev [] ============================ is_list (is_pair is_string is_slev) []
< search. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z * -> is_list (is_pair is_string is_slev) Z IsA : is_list is_string (A1::ARest) IsB : is_list is_slev (B1::BRest) Z : zip ARest BRest Rest * ============================ is_list (is_pair is_string is_slev) ((A1, B1)::Rest)
< case IsA. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z * -> is_list (is_pair is_string is_slev) Z IsB : is_list is_slev (B1::BRest) Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest ============================ is_list (is_pair is_string is_slev) ((A1, B1)::Rest)
< case IsB. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z * -> is_list (is_pair is_string is_slev) Z Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest H3 : is_slev B1 H4 : is_list is_slev BRest ============================ is_list (is_pair is_string is_slev) ((A1, B1)::Rest)
< apply IH to _ _ Z. Subgoal 2: Variables: Rest B1 A1 BRest ARest IH : forall A B Z, is_list is_string A -> is_list is_slev B -> zip A B Z * -> is_list (is_pair is_string is_slev) Z Z : zip ARest BRest Rest * H1 : is_string A1 H2 : is_list is_string ARest H3 : is_slev B1 H4 : is_list is_slev BRest H5 : is_list (is_pair is_string is_slev) Rest ============================ is_list (is_pair is_string is_slev) ((A1, B1)::Rest)
< search. Proof completed.
< Define secFunCtxs : (list (pair (string) (pair slev (list slev)))) -> (list (pair (string) (pair (string) (pair value (pair (list (string)) stmt))))) -> prop by secFunCtxs SF FE := forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, RVVal, PNames, Body) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG.
< Extensible_Theorem stmt_secure : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> SFC : secFunCtxs SF FE -> NSA : names_same (ScopeA::EE_A) SG -> NSB : names_same (ScopeB::EE_B) SG -> PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> Sec : secure SF SG PC S SG' -> EvA : evalStmt FE (ScopeA::EE_A) S EE_A' OA -> EvB : evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' on EvA as IH_S, expr_secure : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : level SF SG PC E L -> EvA : evalExpr FE EE_A E VA EE_A' OA -> EvB : evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' on EvA as IH_E, args_secure : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : levelArgs SF SG PC A L -> EvA : evalArgs FE EE_A A VA EE_A' OA -> EvB : evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' on EvA as IH_A, recFields_secure : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : levelRecFields SF SG PC RF L -> EvA : evalRecFields FE EE_A RF VA EE_A' OA -> EvB : evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' on EvA as IH_RF, expr_level : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : level SF SG PC E public -> EvA : evalExpr FE EE_A E VA EE_A' OA -> EvB : evalExpr FE EE_B E VB EE_B' OB -> VA = VB on EvA as IH_E_L, recFields_level : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : levelRecFields SF SG PC RF public -> EvA : evalRecFields FE EE_A RF VA EE_A' OA -> EvB : evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB on EvA as IH_RF_L, args_level : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : levelArgs SF SG PC A Ls -> EvA : evalArgs FE EE_A A VA EE_A' OA -> EvB : evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB on EvA as IH_A_L. Subgoal 1: Variables: S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB IsS : is_stmt S IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC S SG' EvA : evalStmt FE (ScopeA::EE_A) S EE_A' OA EvB : evalStmt FE (ScopeB::EE_B) S EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) /\ is_stmt S)
< search. Subgoal 2: Variables: E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsE : is_expr E IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC E L EvA : evalExpr FE EE_A E VA EE_A' OA EvB : evalExpr FE EE_B E VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_expr E)
< search. Subgoal 3: Variables: A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC A L EvA : evalArgs FE EE_A A VA EE_A' OA EvB : evalArgs FE EE_B A VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_args A)
< search. Subgoal 4: Variables: RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC RF L EvA : evalRecFields FE EE_A RF VA EE_A' OA EvB : evalRecFields FE EE_B RF VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_recFieldExprs RF)
< search. Subgoal 5: Variables: E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsE : is_expr E IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC E public EvA : evalExpr FE EE_A E VA EE_A' OA EvB : evalExpr FE EE_B E VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_expr E)
< search. Subgoal 6: Variables: RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC RF public EvA : evalRecFields FE EE_A RF VA EE_A' OA EvB : evalRecFields FE EE_B RF VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_recFieldExprs RF)
< search. Subgoal 7: Variables: A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC A Ls EvA : evalArgs FE EE_A A VA EE_A' OA EvB : evalArgs FE EE_B A VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_args A)
< search. Subgoal 8.1.1: Variables: SF SG PC SG' FE ScopeA EE_A ScopeB EE_B EE_B' OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC noop SG' EvA : evalStmt FE (ScopeA::EE_A) noop (ScopeA::EE_A) [] @ EvB : evalStmt FE (ScopeB::EE_B) noop EE_B' OB ============================ public_equiv SG' (ScopeA::EE_A) EE_B'
< case EvB. Subgoal 8.1.1: Variables: SF SG PC SG' FE ScopeA EE_A ScopeB EE_B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC noop SG' EvA : evalStmt FE (ScopeA::EE_A) noop (ScopeA::EE_A) [] @ ============================ public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
< case Sec. Subgoal 8.1.1: Variables: SF PC SG' FE ScopeA EE_A ScopeB EE_B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) noop (ScopeA::EE_A) [] @ ============================ public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B)
< search. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (seq S1 S2) SG' EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (seq S1 S2) EE_B' OB EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (seq S1 S2) SG' EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (seq S1 S2) EE_B' OB EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (seq S1 S2) EE_B' OB EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG' EE_A' EE_B'
< PE1: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG3 EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG3 EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG3 EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply secure_is to _ _ _ Sec. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG3 EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_slev)) SG3 ============================ public_equiv SG' EE_A' EE_B'
< NSA': apply secure_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG3 EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_slev)) SG3 NSA' : names_same EE1 SG3 ============================ public_equiv SG' EE_A' EE_B'
< NSB': apply secure_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG3 EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_slev)) SG3 NSA' : names_same EE1 SG3 NSB' : names_same EE2 SG3 ============================ public_equiv SG' EE_A' EE_B'
< case NSA. Subgoal 8.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG3 EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_slev)) SG3 NSA' : names_same EE1 SG3 NSB' : names_same EE2 SG3 H6 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H8 : names_same EE_A BRest ============================ public_equiv SG' EE_A' EE_B'
< apply secure_older_scopes to _ _ _ Sec. Subgoal 8.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 EE2 O3 O4 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv (Scope'::BRest) EE1 EE2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same EE1 (Scope'::BRest) NSB' : names_same EE2 (Scope'::BRest) H6 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H8 : names_same EE_A BRest H9 : forall X L, lookup B X L -> lookup Scope' X L ============================ public_equiv SG' EE_A' EE_B'
< case NSA' (keep). Subgoal 8.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 O2 S2 S1 EE2 O3 O4 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O1 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv (Scope'::BRest) (A::ARest) EE2 H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same EE2 (Scope'::BRest) H6 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H8 : names_same EE_A BRest H9 : forall X L, lookup B X L -> lookup Scope' X L H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H11 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H12 : names_same ARest BRest ============================ public_equiv SG' EE_A' EE_B'
< case NSB. Subgoal 8.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 O2 S2 S1 EE2 O3 O4 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O1 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv (Scope'::BRest) (A::ARest) EE2 H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same EE2 (Scope'::BRest) H6 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H8 : names_same EE_A BRest H9 : forall X L, lookup B X L -> lookup Scope' X L H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H11 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H15 : names_same EE_B BRest ============================ public_equiv SG' EE_A' EE_B'
< case NSB' (keep). Subgoal 8.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 O2 S2 S1 O3 O4 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O1 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 (A1::ARest1) O3 EvB1 : evalStmt FE (A1::ARest1) S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv (Scope'::BRest) (A::ARest) (A1::ARest1) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H5 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same (A1::ARest1) (Scope'::BRest) H6 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H8 : names_same EE_A BRest H9 : forall X L, lookup B X L -> lookup Scope' X L H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H11 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H15 : names_same EE_B BRest H16 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) Scope' H17 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A1 H18 : names_same ARest1 BRest ============================ public_equiv SG' EE_A' EE_B'
< case PE1 (keep). Subgoal 8.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 O2 S2 S1 O3 O4 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O1 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 (A1::ARest1) O3 EvB1 : evalStmt FE (A1::ARest1) S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv (Scope'::BRest) (A::ARest) (A1::ARest1) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H5 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same (A1::ARest1) (Scope'::BRest) H6 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H8 : names_same EE_A BRest H9 : forall X L, lookup B X L -> lookup Scope' X L H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H11 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H15 : names_same EE_B BRest H16 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) Scope' H17 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A1 H18 : names_same ARest1 BRest H19 : forall X V, lookup Scope' X public -> lookup A X V -> lookup A1 X V H20 : forall X V, lookup Scope' X public -> lookup A1 X V -> lookup A X V H21 : public_equiv BRest ARest ARest1 ============================ public_equiv SG' EE_A' EE_B'
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA2 EvB1. Subgoal 8.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 O2 S2 S1 O3 O4 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O1 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 (A1::ARest1) O3 EvB1 : evalStmt FE (A1::ARest1) S2 EE_B' O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv (Scope'::BRest) (A::ARest) (A1::ARest1) H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H5 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same (A1::ARest1) (Scope'::BRest) H6 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H8 : names_same EE_A BRest H9 : forall X L, lookup B X L -> lookup Scope' X L H10 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H11 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H12 : names_same ARest BRest H13 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H14 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H15 : names_same EE_B BRest H16 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) Scope' H17 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A1 H18 : names_same ARest1 BRest H19 : forall X V, lookup Scope' X public -> lookup A X V -> lookup A1 X V H20 : forall X V, lookup Scope' X public -> lookup A1 X V -> lookup A X V H21 : public_equiv BRest ARest ARest1 H22 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.3: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (declare Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * ============================ public_equiv SG' (((X, V)::Scope)::EE1) EE_B'
< case IsS. Subgoal 8.1.3: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (declare Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ public_equiv SG' (((X, V)::Scope)::EE1) EE_B'
< Sec: case Sec. Subgoal 8.1.3: Variables: SF FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty SG1 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X ============================ public_equiv (((X, public)::Scope1)::SG1) (((X, V)::Scope)::EE1) EE_B'
< EvB: case EvB. Subgoal 8.1.3: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB ============================ public_equiv (((X, public)::Scope1)::SG1) (((X, V)::Scope)::EE1) (((X, V1)::Scope2)::EE2)
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.3: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB H4 : public_equiv (Scope1::SG1) (Scope::EE1) (Scope2::EE2) ============================ public_equiv (((X, public)::Scope1)::SG1) (((X, V)::Scope)::EE1) (((X, V1)::Scope2)::EE2)
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.3: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope X E Ty SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V1)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB H4 : public_equiv (Scope1::SG1) (Scope::EE1) (Scope2::EE2) ============================ public_equiv (((X, public)::Scope1)::SG1) (((X, V1)::Scope)::EE1) (((X, V1)::Scope2)::EE2)
< backchain public_equiv_add_public. Subgoal 8.1.4: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (assign X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (assign X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.4: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (assign X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (assign X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.4: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (assign X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private ============================ public_equiv SG' EE_A' EE_B'
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private PE' : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private PE' : public_equiv SG' EE1 EE2 H3 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private PE' : public_equiv SG' EE1 EE2 H3 : names_same EE1 SG' H4 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_replaceScopes_other to PE' _ _ Sec1 _ EvA2 EvB1. Subgoal 8.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private PE' : public_equiv SG' EE1 EE2 H3 : names_same EE1 SG' H4 : names_same EE2 SG' H5 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public ============================ public_equiv SG' EE_A' EE_B'
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public PE' : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public PE' : public_equiv SG' EE1 EE2 H3 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public PE' : public_equiv SG' EE1 EE2 H3 : names_same EE1 SG' H4 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 EE1 OA * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public PE' : public_equiv SG' EE1 EE2 H3 : names_same EE1 SG' H4 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_replaceScopes_public to PE' _ _ Sec1 EvA2 EvB1. Subgoal 8.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 EE1 OA * EvA2 : replaceScopes X V1 EE1 EE_A' H1 : is_string X H2 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public PE' : public_equiv SG' EE1 EE2 H3 : names_same EE1 SG' H4 : names_same EE2 SG' H5 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.5: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (recUpdate Rec Fields E) SG' EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.5: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (recUpdate Rec Fields E) SG' EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.5: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (recUpdate Rec Fields E) SG' EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private ============================ public_equiv SG' EE_A' EE_B'
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private PE' : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_replaceScopes_other to PE' _ _ Sec1 _ EvA4 EvB3. Subgoal 8.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' H6 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public ============================ public_equiv SG' EE_A' EE_B'
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< LB: apply public_equiv_lookupScopes to PE _ _ _ Sec1 EvA2. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V1 FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' LB : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals) ============================ public_equiv SG' EE_A' EE_B'
< apply lookupScopes_unique to LB EvB1. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals1) EvA3 : updateRecFields Fields V1 FieldVals1 NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' LB : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) ============================ public_equiv SG' EE_A' EE_B'
< apply updateRecFields_unique to EvA3 EvB2. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals1) EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' LB : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_replaceScopes_public to PE' _ _ Sec1 EvA4 EvB3. Subgoal 8.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals1) EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1 EvA4 : replaceScopes Rec (recVal NewVals1) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public PE' : public_equiv SG' EE1 EE2 H4 : names_same EE1 SG' H5 : names_same EE2 SG' LB : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) H6 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.6: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.6: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.6: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG' EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_add_scope to PE1. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) ============================ public_equiv SG' EE_A' EE_B'
< NSA1: apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSA1. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB1: apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSB1. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_is to _ _ _ Sec. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L ============================ public_equiv SG' EE_A' EE_B'
< apply join_is to _ _ Sec1. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 ============================ public_equiv SG' EE_A' EE_B'
< PE2: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 PE2 : public_equiv SGT (Scope::EE_A') (Scope1::EE_B') ============================ public_equiv SG' EE_A' EE_B'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGF EE2 O3 Scope1 O4 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th (Scope'::SG') Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 PE2 : public_equiv (Scope'::SG') (Scope::EE_A') (Scope1::EE_B') H11 : forall X L, lookup [] X L -> lookup Scope' X L ============================ public_equiv SG' EE_A' EE_B'
< case PE2. Subgoal 8.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGF EE2 O3 Scope1 O4 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th (Scope'::SG') Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 H11 : forall X L, lookup [] X L -> lookup Scope' X L H12 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope1 X V H13 : forall X V, lookup Scope' X public -> lookup Scope1 X V -> lookup Scope X V H14 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG' EE_A' EE_B'
< NSA1: apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSA1. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB1: apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSB1. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_is to _ _ _ Sec. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L ============================ public_equiv SG' EE_A' EE_B'
< apply join_is to _ _ Sec1. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 ============================ public_equiv SG' EE_A' EE_B'
< assert Sl1 = public -> false. Subgoal 8.1.6.2.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.1.6.2.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.1.6.2.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev public ============================ false
< apply join_public to _ _ Sec1. Subgoal 8.1.6.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' public Cond public Sec1 : join public public public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev public H9 : is_slev public ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false ============================ public_equiv SG' EE_A' EE_B'
< PEA: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Sec2 _. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' ============================ public_equiv SG' EE_A' EE_B'
< PEB: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Sec3 _. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' ============================ public_equiv SG' EE_A' EE_B'
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< PE1B: apply public_equiv_trans to PE' PEB. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' ============================ public_equiv SG' EE_A' EE_B'
< IsA+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' IsA+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A') ============================ public_equiv SG' EE_A' EE_B'
< case IsA+. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ public_equiv SG' EE_A' EE_B'
< case IsEE_A. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' H13 : is_list (is_pair is_string is_value) ScopeA H14 : is_list (is_list (is_pair is_string is_value)) EE_A ============================ public_equiv SG' EE_A' EE_B'
< PEA1: apply public_equiv_symm to PEA. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' H13 : is_list (is_pair is_string is_value) ScopeA H14 : is_list (is_list (is_pair is_string is_value)) EE_A PEA1 : public_equiv SG' EE_A' EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_trans to PEA1 PE1B. Subgoal 8.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' H13 : is_list (is_pair is_string is_value) ScopeA H14 : is_list (is_list (is_pair is_string is_value)) EE_A PEA1 : public_equiv SG' EE_A' EE1 H15 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.7: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.7: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.7: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG' EE_A' EE_B'
< NSA1: apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSA1. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB1: apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSB1. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_is to _ _ _ Sec. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L ============================ public_equiv SG' EE_A' EE_B'
< apply join_is to _ _ Sec1. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 ============================ public_equiv SG' EE_A' EE_B'
< assert Sl1 = public -> false. Subgoal 8.1.7.1.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.1.7.1.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.1.7.1.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev public ============================ false
< apply join_public to _ _ Sec1. Subgoal 8.1.7.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' public Cond public Sec1 : join public public public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev public H9 : is_slev public ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false ============================ public_equiv SG' EE_A' EE_B'
< PEA: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Sec3 _. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' ============================ public_equiv SG' EE_A' EE_B'
< PEB: apply stmt_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Sec2 _. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' ============================ public_equiv SG' EE_A' EE_B'
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< PE1B: apply public_equiv_trans to PE' PEB. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' ============================ public_equiv SG' EE_A' EE_B'
< IsA+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' IsA+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A') ============================ public_equiv SG' EE_A' EE_B'
< case IsA+. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ public_equiv SG' EE_A' EE_B'
< case IsEE_A. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' H13 : is_list (is_pair is_string is_value) ScopeA H14 : is_list (is_list (is_pair is_string is_value)) EE_A ============================ public_equiv SG' EE_A' EE_B'
< PEA1: apply public_equiv_symm to PEA. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' H13 : is_list (is_pair is_string is_value) ScopeA H14 : is_list (is_list (is_pair is_string is_value)) EE_A PEA1 : public_equiv SG' EE_A' EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_trans to PEA1 PE1B. Subgoal 8.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H5 : names_same ([]::EE2) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_slev L H9 : is_slev Sl1 H10 : Sl1 = public -> false PEA : public_equiv SG' EE1 EE_A' PEB : public_equiv SG' EE2 EE_B' PE' : public_equiv SG' EE1 EE2 PE1B : public_equiv SG' EE1 EE_B' H11 : is_list (is_pair is_string is_value) Scope H12 : is_list (is_list (is_pair is_string is_value)) EE_A' H13 : is_list (is_pair is_string is_value) ScopeA H14 : is_list (is_list (is_pair is_string is_value)) EE_A PEA1 : public_equiv SG' EE_A' EE1 H15 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG' EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_add_scope to PE1. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) ============================ public_equiv SG' EE_A' EE_B'
< NSA1: apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSA1. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB1: apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSB1. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG' EE_A' EE_B'
< apply level_is to _ _ _ Sec. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L ============================ public_equiv SG' EE_A' EE_B'
< apply join_is to _ _ Sec1. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 ============================ public_equiv SG' EE_A' EE_B'
< PE2: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec3 EvA2 EvB1. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 PE2 : public_equiv SGF (Scope::EE_A') (Scope1::EE_B') ============================ public_equiv SG' EE_A' EE_B'
< apply secure_older_scopes to _ _ _ Sec3. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT EE2 O3 Scope1 O4 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 PE2 : public_equiv (Scope'::SG') (Scope::EE_A') (Scope1::EE_B') H11 : forall X L, lookup [] X L -> lookup Scope' X L ============================ public_equiv SG' EE_A' EE_B'
< case PE2. Subgoal 8.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT EE2 O3 Scope1 O4 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB PE1 : public_equiv SG' EE1 EE2 H4 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) NSA1 : names_same EE1 SG' H5 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE2 SG' H6 : names_same ([]::EE2) ([]::SG') H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_slev L H10 : is_slev Sl1 H11 : forall X L, lookup [] X L -> lookup Scope' X L H12 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope1 X V H13 : forall X V, lookup Scope' X public -> lookup Scope1 X V -> lookup Scope X V H14 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.8: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.8: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec (keep). Subgoal 8.1.8.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB ============================ public_equiv SG' EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_add_scope to PE1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) ============================ public_equiv SG' EE_A' EE_B'
< NSA1: apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSA1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB1: apply level_eval_names_same to _ _ _ _ _ _ EvB Sec1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSB1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG' EE_A' EE_B'
< PE2: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv (Scope1::SG2) (Scope::EE2) (Scope2::EE4) ============================ public_equiv SG' EE_A' EE_B'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv (Scope'::SG') (Scope::EE2) (Scope2::EE4) H8 : forall X L, lookup [] X L -> lookup Scope' X L ============================ public_equiv SG' EE_A' EE_B'
< case PE2. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 ============================ public_equiv SG' EE_A' EE_B'
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ public_equiv SG' EE_A' EE_B'
< case IsEE2+. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG' EE_A' EE_B'
< IsEE4+: apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope2::EE4) ============================ public_equiv SG' EE_A' EE_B'
< case IsEE4+. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ public_equiv SG' EE_A' EE_B'
< NSA2: apply secure_eval_names_same to _ _ _ _ _ _ EvA2 Sec2. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA2 : names_same (Scope::EE2) (Scope'::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB2: apply secure_eval_names_same to _ _ _ _ _ _ EvB1 Sec2. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA2 : names_same (Scope::EE2) (Scope'::SG') NSB2 : names_same (Scope2::EE4) (Scope'::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSA': case NSA2. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSB2 : names_same (Scope2::EE4) (Scope'::SG') NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< NSB': case NSB2. Subgoal 8.1.8.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 SG' NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB'2 : names_same EE4 SG' ============================ public_equiv SG' EE_A' EE_B'
< case NSA. Subgoal 8.1.8.1.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 EE4 O5 O6 O7 Scope' BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 (B::BRest) NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB'2 : names_same EE4 (B::BRest) H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest ============================ public_equiv (B::BRest) EE_A' EE_B'
< case NSB'2. Subgoal 8.1.8.1.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L EE3 O4 Scope2 O5 O6 O7 Scope' BRest B ARest A IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A::ARest)) O5 EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) EE2 (A::ARest) H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) (A::ARest) NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 (B::BRest) NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest ============================ public_equiv (B::BRest) EE_A' EE_B'
< case NSA'2. Subgoal 8.1.8.1.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 O3 O12 Body Cond L EE3 O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A1::ARest1)) O2 * EvA3 : evalStmt FE (A1::ARest1) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A::ARest)) O5 EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) (A1::ARest1) (A::ARest) H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) (A::ARest) NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest ============================ public_equiv (B::BRest) EE_A' EE_B'
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec EvA3 EvB2. Subgoal 8.1.8.1.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 O3 O12 Body Cond L EE3 O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A1::ARest1)) O2 * EvA3 : evalStmt FE (A1::ARest1) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A::ARest)) O5 EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) (A1::ARest1) (A::ARest) H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) (A::ARest) NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest H25 : public_equiv (B::BRest) EE_A' EE_B' ============================ public_equiv (B::BRest) EE_A' EE_B'
< search. Subgoal 8.1.8.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ public_equiv SG' EE_A' EE_B'
< assert L = public -> false. Subgoal 8.1.8.1.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ L = public -> false
< intros E. Subgoal 8.1.8.1.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB E : L = public ============================ false
< case E. Subgoal 8.1.8.1.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond public Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 8.1.8.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : L = public -> false ============================ public_equiv SG' EE_A' EE_B'
< PEA: apply while_no_public_change to _ _ _ _ _ _ _ _ Sec Sec1 _ EvA. Subgoal 8.1.8.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : L = public -> false PEA : public_equiv SG' (ScopeA::EE_A) EE_A' ============================ public_equiv SG' EE_A' EE_B'
< PEB: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvB Sec1 _. Subgoal 8.1.8.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : L = public -> false PEA : public_equiv SG' (ScopeA::EE_A) EE_A' PEB : public_equiv SG' (ScopeB::EE_B) EE_B' ============================ public_equiv SG' EE_A' EE_B'
< PEA': apply public_equiv_symm to PEA. Subgoal 8.1.8.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : L = public -> false PEA : public_equiv SG' (ScopeA::EE_A) EE_A' PEB : public_equiv SG' (ScopeB::EE_B) EE_B' PEA' : public_equiv SG' EE_A' (ScopeA::EE_A) ============================ public_equiv SG' EE_A' EE_B'
< PEAB: apply public_equiv_trans to PEA' PE. Subgoal 8.1.8.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : L = public -> false PEA : public_equiv SG' (ScopeA::EE_A) EE_A' PEB : public_equiv SG' (ScopeB::EE_B) EE_B' PEA' : public_equiv SG' EE_A' (ScopeA::EE_A) PEAB : public_equiv SG' EE_A' (ScopeB::EE_B) ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_trans to PEAB PEB. Subgoal 8.1.8.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : L = public -> false PEA : public_equiv SG' (ScopeA::EE_A) EE_A' PEB : public_equiv SG' (ScopeB::EE_B) EE_B' PEA' : public_equiv SG' EE_A' (ScopeA::EE_A) PEAB : public_equiv SG' EE_A' (ScopeB::EE_B) H4 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.8.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB ============================ public_equiv SG' EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_add_scope to PE1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) ============================ public_equiv SG' EE_A' EE_B'
< NSA1: apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSA1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB1: apply level_eval_names_same to _ _ _ _ _ _ EvB Sec1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSB1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG' EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ public_equiv SG' EE_A' EE_B'
< PE2: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv (Scope1::SG2) (Scope::EE2) (Scope2::EE4) ============================ public_equiv SG' EE_A' EE_B'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 PE2 : public_equiv (Scope'::SG') (Scope::EE2) (Scope2::EE4) H8 : forall X L, lookup [] X L -> lookup Scope' X L ============================ public_equiv SG' EE_A' EE_B'
< case PE2. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 ============================ public_equiv SG' EE_A' EE_B'
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ public_equiv SG' EE_A' EE_B'
< case IsEE2+. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG' EE_A' EE_B'
< IsEE4+: apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope2::EE4) ============================ public_equiv SG' EE_A' EE_B'
< case IsEE4+. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ public_equiv SG' EE_A' EE_B'
< NSA2: apply secure_eval_names_same to _ _ _ _ _ _ EvA2 Sec2. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA2 : names_same (Scope::EE2) (Scope'::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSB2: apply secure_eval_names_same to _ _ _ _ _ _ EvB1 Sec2. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA2 : names_same (Scope::EE2) (Scope'::SG') NSB2 : names_same (Scope2::EE4) (Scope'::SG') ============================ public_equiv SG' EE_A' EE_B'
< NSA': case NSA2. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSB2 : names_same (Scope2::EE4) (Scope'::SG') NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 SG' ============================ public_equiv SG' EE_A' EE_B'
< NSB': case NSB2. Subgoal 8.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope'::SG') EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv SG' EE1 EE3 H3 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) NSA1 : names_same EE1 SG' H4 : names_same ([]::EE1) ([]::SG') NSB1 : names_same EE3 SG' H5 : names_same ([]::EE3) ([]::SG') H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv SG' EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 SG' NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB'2 : names_same EE4 SG' ============================ public_equiv SG' EE_A' EE_B'
< case NSA. Subgoal 8.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 Scope' BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) EE2 EE4 H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) EE4 NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 (B::BRest) NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB'2 : names_same EE4 (B::BRest) H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest ============================ public_equiv (B::BRest) EE_A' EE_B'
< case NSB'2. Subgoal 8.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 Scope' BRest B ARest A IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A::ARest)) O5 EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) EE2 (A::ARest) H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) EE2 H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) (A::ARest) NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA'2 : names_same EE2 (B::BRest) NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest ============================ public_equiv (B::BRest) EE_A' EE_B'
< case NSA'2. Subgoal 8.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A1::ARest1)) O2 * EvA3 : evalStmt FE (A1::ARest1) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A::ARest)) O5 EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) (A1::ARest1) (A::ARest) H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) (A::ARest) NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest ============================ public_equiv (B::BRest) EE_A' EE_B'
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec EvA3 EvB2. Subgoal 8.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 Scope' BRest B ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A1::ARest1)) O2 * EvA3 : evalStmt FE (A1::ARest1) (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A::ARest)) O5 EvB2 : evalStmt FE (A::ARest) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB PE1 : public_equiv (B::BRest) EE1 EE3 H3 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) NSA1 : names_same EE1 (B::BRest) H4 : names_same ([]::EE1) ([]::(B::BRest)) NSB1 : names_same EE3 (B::BRest) H5 : names_same ([]::EE3) ([]::(B::BRest)) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE3 H8 : forall X L, lookup [] X L -> lookup Scope' X L H9 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V H10 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V H11 : public_equiv (B::BRest) (A1::ARest1) (A::ARest) H12 : is_list (is_pair is_string is_value) Scope H13 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H14 : is_list (is_pair is_string is_value) Scope2 H15 : is_list (is_list (is_pair is_string is_value)) (A::ARest) NSA' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSB' : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB'1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 H16 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H17 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H18 : names_same EE_A BRest H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest H25 : public_equiv (B::BRest) EE_A' EE_B' ============================ public_equiv (B::BRest) EE_A' EE_B'
< search. Subgoal 8.1.8.2.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 8.1.9: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.9: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec (keep). Subgoal 8.1.9.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB (keep). Subgoal 8.1.9.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB ============================ public_equiv SG' EE_A' EE_B'
< assert L = public -> false. Subgoal 8.1.9.1.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB ============================ L = public -> false
< intros E. Subgoal 8.1.9.1.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB E : L = public ============================ false
< case E. Subgoal 8.1.9.1.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond public Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB1. Subgoal 8.1.9.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB H3 : L = public -> false ============================ public_equiv SG' EE_A' EE_B'
< PEB: apply while_no_public_change to _ _ _ _ _ _ _ _ Sec Sec1 _ EvB. Subgoal 8.1.9.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB H3 : L = public -> false PEB : public_equiv SG' (ScopeB::EE_B) EE_B' ============================ public_equiv SG' EE_A' EE_B'
< PEA: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvA1 Sec1 _. Subgoal 8.1.9.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB H3 : L = public -> false PEB : public_equiv SG' (ScopeB::EE_B) EE_B' PEA : public_equiv SG' (ScopeA::EE_A) EE_A' ============================ public_equiv SG' EE_A' EE_B'
< PEA': apply public_equiv_symm to PEA. Subgoal 8.1.9.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB H3 : L = public -> false PEB : public_equiv SG' (ScopeB::EE_B) EE_B' PEA : public_equiv SG' (ScopeA::EE_A) EE_A' PEA' : public_equiv SG' EE_A' (ScopeA::EE_A) ============================ public_equiv SG' EE_A' EE_B'
< PEAB: apply public_equiv_trans to PEA' PE. Subgoal 8.1.9.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB H3 : L = public -> false PEB : public_equiv SG' (ScopeB::EE_B) EE_B' PEA : public_equiv SG' (ScopeA::EE_A) EE_A' PEA' : public_equiv SG' EE_A' (ScopeA::EE_A) PEAB : public_equiv SG' EE_A' (ScopeB::EE_B) ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_trans to PEAB PEB. Subgoal 8.1.9.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB2 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB3 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB4 : O1 ++ O2 = O12 EvB5 : O12 ++ O3 = OB H3 : L = public -> false PEB : public_equiv SG' (ScopeB::EE_B) EE_B' PEA : public_equiv SG' (ScopeA::EE_A) EE_A' PEA' : public_equiv SG' EE_A' (ScopeA::EE_A) PEAB : public_equiv SG' EE_A' (ScopeB::EE_B) H4 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.9.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB1. Subgoal 8.1.9.1.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) EvB1 : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.9.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.9.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB1 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB3 : O1 ++ O2 = O12 EvB4 : O12 ++ O3 = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 8.1.9.2.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 8.1.9.2.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB H3 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.10: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (scopeStmt S1) SG' EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.10: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (scopeStmt S1) SG' EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB ============================ public_equiv SG' EE_A' EE_B'
< apply public_equiv_add_scope to PE. Subgoal 8.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B)) ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSA. Subgoal 8.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B)) H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< apply names_same_add_scope to NSB. Subgoal 8.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B)) H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG') H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG') ============================ public_equiv SG' EE_A' EE_B'
< PE': apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B)) H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG') H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG') PE' : public_equiv (Scope1::SG') (Scope::EE_A') (Scope2::EE_B') ============================ public_equiv SG' EE_A' EE_B'
< case PE'. Subgoal 8.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B)) H3 : names_same ([]::(ScopeA::EE_A)) ([]::SG') H4 : names_same ([]::(ScopeB::EE_B)) ([]::SG') H5 : forall X V, lookup Scope1 X public -> lookup Scope X V -> lookup Scope2 X V H6 : forall X V, lookup Scope1 X public -> lookup Scope2 X V -> lookup Scope X V H7 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.11: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.11: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.11: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.11.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E I1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.11.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E I1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.11.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.11.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.11.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.11.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.11.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.11.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.12: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.12: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.12: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.12.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.12.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.12.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.12.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.12.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.12.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.12.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.12.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.13: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.13: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.13: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.13.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.13.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.13.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.13.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.13.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.13.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.13.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.13.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.14: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA ============================ public_equiv SG' EE_A' EE_B'
< case IsS. Subgoal 8.1.14: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.14: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ public_equiv SG' EE_A' EE_B'
< EvB: case EvB. Subgoal 8.1.14.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.14.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.14.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.14.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.14.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.14.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.14.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E S2 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ public_equiv SG' EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.14.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E S2 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB H2 : public_equiv SG' EE_A' EE_B' ============================ public_equiv SG' EE_A' EE_B'
< search. Subgoal 8.1.15: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt (secdecl L Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (secdecl L Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * ============================ public_equiv SG' (((X, V)::Scope)::EE1) EE_B'
< case IsS. Subgoal 8.1.15: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (secdecl L Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ public_equiv SG' (((X, V)::Scope)::EE1) EE_B'
< EvB: case EvB. Subgoal 8.1.15: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty L EE2 Scope1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (secdecl L Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope1::EE2) OB ============================ public_equiv SG' (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< Sec: case Sec. Subgoal 8.1.15.1: Variables: SF PC FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty EE2 Scope1 V1 L1 SG1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope2::SG1) NSB : names_same (ScopeB::EE_B) (Scope2::SG1) PE : public_equiv (Scope2::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope1::EE2) OB Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X ============================ public_equiv (((X, private)::Scope2)::SG1) (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.15.1: Variables: SF PC FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty EE2 Scope1 V1 L1 SG1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope2::SG1) NSB : names_same (ScopeB::EE_B) (Scope2::SG1) PE : public_equiv (Scope2::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope1::EE2) OB Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X PE' : public_equiv (Scope2::SG1) (Scope::EE1) (Scope1::EE2) ============================ public_equiv (((X, private)::Scope2)::SG1) (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< backchain public_equiv_add_other. Subgoal 8.1.15.2: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty EE2 Scope1 V1 SG1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope2::SG1) NSB : names_same (ScopeB::EE_B) (Scope2::SG1) PE : public_equiv (Scope2::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope1::EE2) OB Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X ============================ public_equiv (((X, public)::Scope2)::SG1) (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.15.2: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty EE2 Scope1 V1 SG1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope2::SG1) NSB : names_same (ScopeB::EE_B) (Scope2::SG1) PE : public_equiv (Scope2::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope1::EE2) OB Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X PE' : public_equiv (Scope2::SG1) (Scope::EE1) (Scope1::EE2) ============================ public_equiv (((X, public)::Scope2)::SG1) (((X, V)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 8.1.15.2: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope X E Ty EE2 Scope1 V1 SG1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope2::SG1) NSB : names_same (ScopeB::EE_B) (Scope2::SG1) PE : public_equiv (Scope2::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V1)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V1 (Scope::EE1) OA * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope1::EE2) OB Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X PE' : public_equiv (Scope2::SG1) (Scope::EE1) (Scope1::EE2) ============================ public_equiv (((X, public)::Scope2)::SG1) (((X, V1)::Scope)::EE1) (((X, V1)::Scope1)::EE2)
< backchain public_equiv_add_public. Subgoal 8.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC <unknown K evalStmt> SG' EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * ============================ public_equiv SG' EE_A' EE_B'
< Sec: case Sec. Subgoal 8.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' ============================ public_equiv SG' EE_A' EE_B'
< apply names_is to _ EvA1. Subgoal 8.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names ============================ public_equiv SG' EE_A' EE_B'
< apply names_is_sec to _ Sec. Subgoal 8.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG' EE_A' EE_B'
< apply proj_stmt_unique to Sec1 EvA2 _ _ _ _ _. Subgoal 8.1.16.1: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 8.1.16.1: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NSA EvA1 Sec M. Subgoal 8.1.16.1: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 8.1.16.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 8.1.16.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NSA EvA1 Sec M. Subgoal 8.1.16.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 8.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG' EE_A' EE_B'
< apply proj_stmt_is to Sec1 _ _. Subgoal 8.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P ============================ public_equiv SG' EE_A' EE_B'
< case NSA (keep). Subgoal 8.1.16: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest ============================ public_equiv SG' EE_A' EE_B'
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< NSB-: apply names_same_symmetric to NSB. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< NSAB: apply names_same_transitive to NSA NSB-. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< NamesB: apply names_exists to IsEE_B. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< apply names_is to _ EvA1. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< apply names_is to _ NamesB. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< PrB: apply proj_stmt_other to EvA2 _ _ _ with L' = N. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< apply proj_stmt_unique to EvA2 PrB _ _ _ _ _. Subgoal 8.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ forall X, mem X N -> mem X Names
< intros M. Subgoal 8.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X N ============================ mem X Names
< NSBA: apply names_same_symmetric to NSAB. Subgoal 8.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X N NSBA : names_same (ScopeB::EE_B) (ScopeA::EE_A) ============================ mem X Names
< apply names_same_names to NSBA NamesB EvA1 M. Subgoal 8.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X N NSBA : names_same (ScopeB::EE_B) (ScopeA::EE_A) H10 : mem X Names ============================ mem X Names
< search. Subgoal 8.1.16.4: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ forall X, mem X Names -> mem X N
< intros M. Subgoal 8.1.16.4: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X Names ============================ mem X N
< apply names_same_names to NSAB EvA1 NamesB M. Subgoal 8.1.16.4: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X Names H10 : mem X N ============================ mem X N
< search. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< EvB': apply proj_evalStmt_forward to PrB NamesB _ _ _ EvB. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< EvA': apply proj_evalStmt_forward to EvA2 EvA1 _ _ _ EvA. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' EE''1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE''1 OA EvA'1 : scopes_same EE_A' EE''1 ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< apply evalStmt_unique to _ _ _ EvA' EvA3. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' O_P @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P EvA'1 : scopes_same EE_A' EE_P ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< apply proj_stmt_is to PrB _ _. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' O_P @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P EvA'1 : scopes_same EE_A' EE_P H10 : is_stmt S'' ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< PE_Pr: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA3 EvB'. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' O_P @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P EvA'1 : scopes_same EE_A' EE_P H10 : is_stmt S'' PE_Pr : public_equiv (Scope'::BRest) EE_P EE'' ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< PE': apply public_equiv_scopes_same_snd to PE_Pr EvB'1. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' O_P @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P EvA'1 : scopes_same EE_A' EE_P H10 : is_stmt S'' PE_Pr : public_equiv (Scope'::BRest) EE_P EE'' PE' : public_equiv (Scope'::BRest) EE_P EE_B' ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< apply public_equiv_scopes_same_fst to PE' EvA'1. Subgoal 8.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' O_P @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P EvA'1 : scopes_same EE_A' EE_P H10 : is_stmt S'' PE_Pr : public_equiv (Scope'::BRest) EE_P EE'' PE' : public_equiv (Scope'::BRest) EE_P EE_B' H11 : public_equiv (Scope'::BRest) EE_A' EE_B' ============================ public_equiv (Scope'::BRest) EE_A' EE_B'
< search. Subgoal 8.2.1: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB I IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (num I) L EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case EvB. Subgoal 8.2.1: Variables: SF SG PC L FE EE_A' EE_B' I IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (num I) L EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (plus E1 E2) L EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (plus E1 E2) L EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (minus E1 E2) L EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (minus E1 E2) L EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (mult E1 E2) L EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (mult E1 E2) L EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (div E1 E2) L EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (div E1 E2) L EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.6: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC true L EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case EvB. Subgoal 8.2.6: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC true L EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.7: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC false L EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case EvB. Subgoal 8.2.7: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC false L EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.8: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.8: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.8: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.8.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.8.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 8.2.8.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEA: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 8.2.8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.8.2.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : public = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' ============================ public_equiv SG EE_A' EE_B'
< PEA': apply public_equiv_symm to PEA. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PEA' PE1. Subgoal 8.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.9: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.9: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.9: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.9.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.9.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 8.2.9.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEB: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 8.2.9.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.9.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.9.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.9.1.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PE1 PEB. Subgoal 8.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.9.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.9.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H3 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.9.3.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.9.3.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 8.2.9.3.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEB: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 8.2.9.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.9.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.9.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.9.3.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PE1 PEB. Subgoal 8.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.10: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.10: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.10: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.10.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.10.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 8.2.10.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEA: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 8.2.10.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.10.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.10.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.10.2.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : public = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' ============================ public_equiv SG EE_A' EE_B'
< PEA': apply public_equiv_symm to PEA. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PEA' PE1. Subgoal 8.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.11: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.11: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.11: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.11.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.11.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H3 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.11.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.11.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 8.2.11.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEB: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 8.2.11.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.11.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.11.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.11.2.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PE1 PEB. Subgoal 8.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.11.3.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.11.3.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 8.2.11.3.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEB: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 8.2.11.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.11.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.11.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.11.3.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PE1 PEB. Subgoal 8.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false PE1 : public_equiv SG EE_A' EE1 H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEB : public_equiv SG EE1 EE_B' H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.12: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.12: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.12: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.12.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.12.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 8.2.12.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEA: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 8.2.12.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.12.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.12.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.12.1.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : public = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' ============================ public_equiv SG EE_A' EE_B'
< PEA': apply public_equiv_symm to PEA. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PEA' PE1. Subgoal 8.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.13: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.13: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.13: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< NEq: assert L2 = public -> false. Subgoal 8.2.13.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 8.2.13.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 8.2.13.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ false
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false ============================ public_equiv SG EE_A' EE_B'
< PE1: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< PEA: apply expr_not_public_no_public_change to _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 8.2.13.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 8.2.13.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 8.2.13.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 8.2.13.1.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : public = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' ============================ public_equiv SG EE_A' EE_B'
< PEA': apply public_equiv_symm to PEA. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_trans to PEA' PE1. Subgoal 8.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false PE1 : public_equiv SG EE1 EE_B' H3 : names_same EE1 SG H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_slev L2 H6 : is_slev Sl1 PEA : public_equiv SG EE1 EE_A' PEA' : public_equiv SG EE_A' EE1 H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_is to _ _ _ Lev. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 ============================ public_equiv SG EE_A' EE_B'
< apply join_is to _ _ Lev1. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L2 H9 : is_slev Sl1 H10 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.14: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.14: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.14: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.14.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.14.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H2 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.14.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.14.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H2 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.15: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.15: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.15: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.15.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.15.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H2 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.15.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.15.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H2 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.16: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.16: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.16: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.17: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.17: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.17: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.18: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.18: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.18: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.19: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.19: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.19: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.20: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (stringLit S) L EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case EvB. Subgoal 8.2.20: Variables: SF SG PC L FE EE_A' EE_B' S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (stringLit S) L EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (appString E1 E2) L EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (appString E1 E2) L EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.22: Variables: SF SG PC L FE EE_A' VA EE_B EE_B' VB OB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (name X) L EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' OB EvA1 : lookupScopes X EE_A' VA ============================ public_equiv SG EE_A' EE_B'
< case EvB. Subgoal 8.2.22: Variables: SF SG PC L FE EE_A' VA EE_B' VB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (name X) L EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvA1 : lookupScopes X EE_A' VA H1 : lookupScopes X EE_B' VB ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.23: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) L EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.23: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) L EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.23: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) L EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ public_equiv SG EE_A' EE_B'
< apply IH_A to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs ============================ public_equiv SG EE_A' EE_B'
< apply IH_A to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (stmtExpr S E1) L EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (stmtExpr S E1) L EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (stmtExpr S E1) L EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L ============================ public_equiv SG EE_A' EE_B'
< apply names_same_add_scope to NSA. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) ============================ public_equiv SG EE_A' EE_B'
< apply names_same_add_scope to NSB. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_add_scope to PE. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) ============================ public_equiv SG EE_A' EE_B'
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply secure_is to _ _ _ Lev. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ public_equiv SG EE_A' EE_B'
< apply secure_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_slev)) SG2 H10 : names_same EE1 SG2 ============================ public_equiv SG EE_A' EE_B'
< apply secure_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_slev)) SG2 H10 : names_same EE1 SG2 H11 : names_same EE2 SG2 ============================ public_equiv SG EE_A' EE_B'
< PE': apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_slev)) SG2 H10 : names_same EE1 SG2 H11 : names_same EE2 SG2 PE' : public_equiv SG2 (Scope::EE_A') (Scope1::EE_B') ============================ public_equiv SG EE_A' EE_B'
< apply secure_older_scopes to _ _ _ Lev. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv (Scope'::SG) EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) H10 : names_same EE1 (Scope'::SG) H11 : names_same EE2 (Scope'::SG) PE' : public_equiv (Scope'::SG) (Scope::EE_A') (Scope1::EE_B') H12 : forall X L, lookup [] X L -> lookup Scope' X L ============================ public_equiv SG EE_A' EE_B'
< case PE'. Subgoal 8.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S EE2 O3 Scope1 O4 Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB Lev : secure SF ([]::SG) PC S (Scope'::SG) Lev1 : level SF (Scope'::SG) PC E1 L H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv (Scope'::SG) EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_slev)) (Scope'::SG) H10 : names_same EE1 (Scope'::SG) H11 : names_same EE2 (Scope'::SG) H12 : forall X L, lookup [] X L -> lookup Scope' X L H13 : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope1 X V H14 : forall X V, lookup Scope' X public -> lookup Scope1 X V -> lookup Scope X V H15 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (recBuild RF) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recBuild RF) L EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recBuild RF) L EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recBuild RF) L EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' OB Lev : levelRecFields SF SG PC RF L ============================ public_equiv SG EE_A' EE_B'
< apply IH_RF to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF EvB : evalRecFields FE EE_B RF VF1 EE_B' OB Lev : levelRecFields SF SG PC RF L H2 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (recFieldAccess Rec F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recFieldAccess Rec F) L EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA ============================ public_equiv SG EE_A' EE_B'
< case IsE. Subgoal 8.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recFieldAccess Rec F) L EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recFieldAccess Rec F) L EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB Lev : level SF SG PC Rec L ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB Lev : level SF SG PC Rec L H3 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC <unknown K evalExpr> L EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L ============================ public_equiv SG EE_A' EE_B'
< apply names_is to _ EvA1. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names ============================ public_equiv SG EE_A' EE_B'
< apply names_is_sec to _ Lev. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG EE_A' EE_B'
< apply proj_expr_unique to Lev1 EvA2 _ _ _ _ _. Subgoal 8.2.27.1: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 8.2.27.1: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NSA EvA1 Lev M. Subgoal 8.2.27.1: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 8.2.27.2: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 8.2.27.2: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NSA EvA1 Lev M. Subgoal 8.2.27.2: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ public_equiv SG EE_A' EE_B'
< apply proj_expr_is to Lev1 _ _. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P ============================ public_equiv SG EE_A' EE_B'
< NSB-: apply names_same_symmetric to NSB. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B ============================ public_equiv SG EE_A' EE_B'
< NSAB: apply names_same_transitive to NSA NSB-. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B ============================ public_equiv SG EE_A' EE_B'
< NamesB: apply names_exists to IsEE_B. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N ============================ public_equiv SG EE_A' EE_B'
< apply names_is to _ EvA1. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names ============================ public_equiv SG EE_A' EE_B'
< apply names_is to _ NamesB. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N ============================ public_equiv SG EE_A' EE_B'
< PrB: apply proj_expr_other to EvA2 _ _ _ with L' = N. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ public_equiv SG EE_A' EE_B'
< apply proj_expr_unique to EvA2 PrB _ _ _ _ _. Subgoal 8.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ forall X, mem X N -> mem X Names
< intros M. Subgoal 8.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N ============================ mem X Names
< NSBA: apply names_same_symmetric to NSAB. Subgoal 8.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N NSBA : names_same EE_B EE_A ============================ mem X Names
< apply names_same_names to NSBA NamesB EvA1 M. Subgoal 8.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N NSBA : names_same EE_B EE_A H6 : mem X Names ============================ mem X Names
< search. Subgoal 8.2.27.4: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ forall X, mem X Names -> mem X N
< intros M. Subgoal 8.2.27.4: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X Names ============================ mem X N
< apply names_same_names to NSAB EvA1 NamesB M. Subgoal 8.2.27.4: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X Names H6 : mem X N ============================ mem X N
< search. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ public_equiv SG EE_A' EE_B'
< EvB': apply proj_evalExpr_forward to PrB NamesB _ _ _ EvB. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' ============================ public_equiv SG EE_A' EE_B'
< EvA': apply proj_evalExpr_forward to EvA2 EvA1 _ _ _ EvA. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' EE''1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' VA EE''1 OA EvA'1 : scopes_same EE_A' EE''1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_unique to _ _ _ EvA' EvA3. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P ============================ public_equiv SG EE_A' EE_B'
< apply proj_expr_is to PrB _ _. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' ============================ public_equiv SG EE_A' EE_B'
< PE_Pr: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA3 EvB'. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' PE_Pr : public_equiv SG EE_P EE'' ============================ public_equiv SG EE_A' EE_B'
< PE': apply public_equiv_scopes_same_snd to PE_Pr EvB'1. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' PE_Pr : public_equiv SG EE_P EE'' PE' : public_equiv SG EE_P EE_B' ============================ public_equiv SG EE_A' EE_B'
< apply public_equiv_scopes_same_fst to PE' EvA'1. Subgoal 8.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' PE_Pr : public_equiv SG EE_P EE'' PE' : public_equiv SG EE_P EE_B' H7 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.3.1: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : levelArgs SF SG PC nilArgs L EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case EvB. Subgoal 8.3.1: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : levelArgs SF SG PC nilArgs L EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args (consArgs E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC (consArgs E Rest) L EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsA. Subgoal 8.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC (consArgs E Rest) L EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_A to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.3.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args <unknown K evalArgs> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC <unknown K evalArgs> L EvA : evalArgs FE EE_A <unknown K evalArgs> VA EE_A' OA @ EvB : evalArgs FE EE_B <unknown K evalArgs> VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case Lev. Subgoal 8.4.1: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : levelRecFields SF SG PC nilRecFieldExprs L EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case EvB. Subgoal 8.4.1: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : levelRecFields SF SG PC nilRecFieldExprs L EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ public_equiv SG EE_A' EE_B'
< case IsRF. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ public_equiv SG EE_A' EE_B'
< Lev: case Lev. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E LE LRF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L ============================ public_equiv SG EE_A' EE_B'
< EvB: case EvB. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ public_equiv SG EE_A' EE_B'
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ public_equiv SG EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG ============================ public_equiv SG EE_A' EE_B'
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG ============================ public_equiv SG EE_A' EE_B'
< apply IH_RF to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG H9 : public_equiv SG EE_A' EE_B' ============================ public_equiv SG EE_A' EE_B'
< search. Subgoal 8.4.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs <unknown K evalRecFields> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC <unknown K evalRecFields> L EvA : evalRecFields FE EE_A <unknown K evalRecFields> VA EE_A' OA @ EvB : evalRecFields FE EE_B <unknown K evalRecFields> VB EE_B' OB ============================ public_equiv SG EE_A' EE_B'
< case Lev. Subgoal 8.5.1: Variables: SF SG PC FE EE_A' EE_B EE_B' VB OB I IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (num I) public EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' OB ============================ intVal I = VB
< case EvB. Subgoal 8.5.1: Variables: SF SG PC FE EE_A' EE_B' I IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (num I) public EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ ============================ intVal I = intVal I
< search. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (plus E1 E2) public EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB
< case IsE. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (plus E1 E2) public EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< Lev: case Lev. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ intVal I = VB
< EvB: case EvB. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev1. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ intVal I = intVal I3
< apply join_public to _ _ Lev2. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 + I5 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply plus_integer_unique to EvA3 EvB2. Subgoal 8.5.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I3) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 + I5 = I3 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I3 = intVal I3
< search. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (minus E1 E2) public EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB
< case IsE. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (minus E1 E2) public EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< Lev: case Lev. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ intVal I = VB
< EvB: case EvB. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev1. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ intVal I = intVal I3
< apply join_public to _ _ Lev2. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 - I5 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply minus_integer_unique to EvA3 EvB2. Subgoal 8.5.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I3) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 - I5 = I3 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I3 = intVal I3
< search. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (mult E1 E2) public EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB
< case IsE. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (mult E1 E2) public EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< Lev: case Lev. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ intVal I = VB
< EvB: case EvB. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev1. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ intVal I = intVal I3
< apply join_public to _ _ Lev2. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 * I5 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply multiply_integer_unique to EvA3 EvB2. Subgoal 8.5.4: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I3) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 * I5 = I3 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I3 = intVal I3
< search. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (div E1 E2) public EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA ============================ intVal I = VB
< case IsE. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (div E1 E2) public EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ intVal I = VB
< Lev: case Lev. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ intVal I = VB
< EvB: case EvB. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB ============================ intVal I = intVal I3
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ intVal I = intVal I3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ intVal I = intVal I3
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ intVal I = intVal I3
< apply level_is to _ _ _ Lev1. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L1 L2 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ intVal I = intVal I3
< apply join_public to _ _ Lev2. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 I2 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I4 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 I E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 / I5 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I = intVal I3
< apply divide_integer_unique to EvA3 EvB2. Subgoal 8.5.5: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I3) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I5) EE_A' O2 * EvA3 : I4 / I5 = I3 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ intVal I3 = intVal I3
< search. Subgoal 8.5.6: Variables: SF SG PC FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC true public EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' OB ============================ trueVal = VB
< case EvB. Subgoal 8.5.6: Variables: SF SG PC FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC true public EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ ============================ trueVal = trueVal
< search. Subgoal 8.5.7: Variables: SF SG PC FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC false public EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' OB ============================ falseVal = VB
< case EvB. Subgoal 8.5.7: Variables: SF SG PC FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC false public EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ ============================ falseVal = falseVal
< search. Subgoal 8.5.8: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) public EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ trueVal = VB
< case IsE. Subgoal 8.5.8: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) public EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< Lev: case Lev. Subgoal 8.5.8: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public ============================ trueVal = VB
< EvB: case EvB. Subgoal 8.5.8.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal
< search. Subgoal 8.5.8.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.8.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H3 : is_slev L1 ============================ trueVal = falseVal
< apply join_is to _ _ Lev1. Subgoal 8.5.8.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.8.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ trueVal = falseVal
< apply join_public to _ _ Lev3. Subgoal 8.5.8.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 ============================ trueVal = falseVal
< apply join_is to _ _ Lev1. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ trueVal = falseVal
< apply join_public to _ _ Lev3. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ trueVal = falseVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.8.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG H10 : names_same EE2 SG ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.5.9: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) public EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ falseVal = VB
< case IsE. Subgoal 8.5.9: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) public EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< Lev: case Lev. Subgoal 8.5.9: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public ============================ falseVal = VB
< EvB: case EvB. Subgoal 8.5.9.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.9.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev L1 ============================ falseVal = trueVal
< apply join_is to _ _ Lev1. Subgoal 8.5.9.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.9.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ falseVal = trueVal
< apply join_public to _ _ Lev3. Subgoal 8.5.9.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 Sl1 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.9.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ falseVal = falseVal
< search. Subgoal 8.5.9.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ falseVal = falseVal
< search. Subgoal 8.5.10: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) public EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ falseVal = VB
< case IsE. Subgoal 8.5.10: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) public EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< Lev: case Lev. Subgoal 8.5.10: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public ============================ falseVal = VB
< EvB: case EvB. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 ============================ falseVal = trueVal
< apply join_is to _ _ Lev1. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ falseVal = trueVal
< apply join_public to _ _ Lev3. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ falseVal = trueVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.10.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG H10 : names_same EE2 SG ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.5.10.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ falseVal = falseVal
< search. Subgoal 8.5.10.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = falseVal
< search. Subgoal 8.5.11: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) public EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ trueVal = VB
< case IsE. Subgoal 8.5.11: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) public EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< Lev: case Lev. Subgoal 8.5.11: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public ============================ trueVal = VB
< EvB: case EvB. Subgoal 8.5.11.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ trueVal = trueVal
< search. Subgoal 8.5.11.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ trueVal = trueVal
< search. Subgoal 8.5.11.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.11.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev L1 ============================ trueVal = falseVal
< apply join_is to _ _ Lev1. Subgoal 8.5.11.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.11.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L1 Sl1 L2 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ trueVal = falseVal
< apply join_public to _ _ Lev3. Subgoal 8.5.11.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 Sl1 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.12: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) public EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ trueVal = VB
< case IsE. Subgoal 8.5.12: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) public EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< Lev: case Lev. Subgoal 8.5.12: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public ============================ trueVal = VB
< EvB: case EvB. Subgoal 8.5.12.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ trueVal = trueVal
< search. Subgoal 8.5.12.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal
< search. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 ============================ trueVal = falseVal
< apply join_is to _ _ Lev1. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ trueVal = falseVal
< apply join_public to _ _ Lev3. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ trueVal = falseVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.12.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG H10 : names_same EE2 SG ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.5.13: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) public EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ falseVal = VB
< case IsE. Subgoal 8.5.13: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) public EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< Lev: case Lev. Subgoal 8.5.13: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public ============================ falseVal = VB
< EvB: case EvB. Subgoal 8.5.13.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.13.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H3 : is_slev L1 ============================ falseVal = trueVal
< apply join_is to _ _ Lev1. Subgoal 8.5.13.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.13.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ falseVal = trueVal
< apply join_public to _ _ Lev3. Subgoal 8.5.13.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 ============================ falseVal = trueVal
< apply join_is to _ _ Lev1. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev2. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev L1 H4 : is_slev Sl1 H5 : is_slev L2 ============================ falseVal = trueVal
< apply join_public to _ _ Lev3. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public ============================ falseVal = trueVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.13.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 Sl1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 public Lev3 : join public public public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_slev public H4 : is_slev Sl1 H5 : is_slev public H6 : public_equiv SG EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG H10 : names_same EE2 SG ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 8.5.13.3: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L1 Sl1 L2 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : join L1 PC Sl1 Lev2 : level SF SG Sl1 E2 L2 Lev3 : join L1 L2 public EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = falseVal
< search. Subgoal 8.5.14: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) public EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ trueVal = VB
< case IsE. Subgoal 8.5.14: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) public EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 ============================ trueVal = VB
< Lev: case Lev. Subgoal 8.5.14: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 public ============================ trueVal = VB
< EvB: case EvB. Subgoal 8.5.14.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ trueVal = trueVal
< search. Subgoal 8.5.14.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.15: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) public EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ falseVal = VB
< case IsE. Subgoal 8.5.15: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) public EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 ============================ falseVal = VB
< Lev: case Lev. Subgoal 8.5.15: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 public ============================ falseVal = VB
< EvB: case EvB. Subgoal 8.5.15.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 public EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.15.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 public EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ falseVal = falseVal
< search. Subgoal 8.5.16: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) public EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA ============================ trueVal = VB
< case IsE. Subgoal 8.5.16: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) public EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< Lev: case Lev. Subgoal 8.5.16: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ trueVal = VB
< EvB: case EvB. Subgoal 8.5.16.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ trueVal = trueVal
< search. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ trueVal = falseVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev1. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ trueVal = falseVal
< apply join_public to _ _ Lev2. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA3 : I3 > I4 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ trueVal = falseVal
< L: case EvA3. Subgoal 8.5.16.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public L : I4 < I3 ============================ trueVal = falseVal
< apply less_lesseq_flip_false to L EvB2. Subgoal 8.5.17: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) public EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA ============================ falseVal = VB
< case IsE. Subgoal 8.5.17: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) public EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< Lev: case Lev. Subgoal 8.5.17: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ falseVal = VB
< EvB: case EvB. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ falseVal = trueVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev1. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ falseVal = trueVal
< apply join_public to _ _ Lev2. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 I2 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I3 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA3 : I3 <= I4 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ falseVal = trueVal
< L: case EvB2. Subgoal 8.5.17.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I3) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I4) EE_A' O2 * EvA3 : I3 <= I4 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public L : I4 < I3 ============================ falseVal = trueVal
< apply less_lesseq_flip_false to L EvA3. Subgoal 8.5.17.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L1 L2 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ falseVal = falseVal
< search. Subgoal 8.5.18: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) public EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ trueVal = VB
< case IsE. Subgoal 8.5.18: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) public EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ trueVal = VB
< Lev: case Lev. Subgoal 8.5.18: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ trueVal = VB
< EvB: case EvB. Subgoal 8.5.18.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ trueVal = trueVal
< search. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB ============================ trueVal = falseVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ trueVal = falseVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ trueVal = falseVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ trueVal = falseVal
< apply level_is to _ _ _ Lev1. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L1 L2 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ trueVal = falseVal
< apply join_public to _ _ Lev2. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V1 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ trueVal = falseVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.18.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V2 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 V2 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V2 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ trueVal = falseVal
< apply EvB2 to _. Subgoal 8.5.19: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) public EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA ============================ falseVal = VB
< case IsE. Subgoal 8.5.19: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) public EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ falseVal = VB
< Lev: case Lev. Subgoal 8.5.19: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ falseVal = VB
< EvB: case EvB. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ falseVal = trueVal
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ falseVal = trueVal
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ falseVal = trueVal
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ falseVal = trueVal
< apply level_is to _ _ _ Lev1. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ falseVal = trueVal
< apply join_public to _ _ Lev2. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 V2 O2 E2 E1 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ falseVal = trueVal
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.19.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : V = V -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ falseVal = trueVal
< apply EvA3 to _. Subgoal 8.5.19.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L1 L2 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB ============================ falseVal = falseVal
< search. Subgoal 8.5.20: Variables: SF SG PC FE EE_A' EE_B EE_B' VB OB S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (stringLit S) public EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' OB ============================ stringVal S = VB
< case EvB. Subgoal 8.5.20: Variables: SF SG PC FE EE_A' EE_B' S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (stringLit S) public EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ ============================ stringVal S = stringVal S
< search. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (appString E1 E2) public EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA ============================ stringVal S = VB
< case IsE. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (appString E1 E2) public EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ stringVal S = VB
< Lev: case Lev. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public ============================ stringVal S = VB
< EvB: case EvB. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB ============================ stringVal S = stringVal S3
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ stringVal S = stringVal S3
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ stringVal S = stringVal S3
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ stringVal S = stringVal S3
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ stringVal S = stringVal S3
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ stringVal S = stringVal S3
< apply level_is to _ _ _ Lev. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 ============================ stringVal S = stringVal S3
< apply level_is to _ _ _ Lev1. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L1 L2 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L1 Lev1 : level SF SG PC E2 L2 Lev2 : join L1 L2 public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L1 H9 : is_slev L2 ============================ stringVal S = stringVal S3
< apply join_public to _ _ Lev2. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ stringVal S = stringVal S3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 S2 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S4 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ stringVal S = stringVal S3
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 S E2 E1 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S5) EE_A' O2 * EvA3 : S4 ++ S5 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ stringVal S = stringVal S3
< apply append_unique to EvA3 EvB2. Subgoal 8.5.21: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S3) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S4) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S5) EE_A' O2 * EvA3 : S4 ++ S5 = S3 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : level SF SG PC E2 public Lev2 : join public public public EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_slev public ============================ stringVal S3 = stringVal S3
< search. Subgoal 8.5.22: Variables: SF SG PC FE EE_A' VA EE_B EE_B' VB OB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (name X) public EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' OB EvA1 : lookupScopes X EE_A' VA ============================ VA = VB
< Lev: case Lev. Subgoal 8.5.22: Variables: SF SG PC FE EE_A' VA EE_B EE_B' VB OB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' OB EvA1 : lookupScopes X EE_A' VA Lev : lookupScopes X SG public ============================ VA = VB
< EvB: case EvB. Subgoal 8.5.22: Variables: SF SG PC FE EE_A' VA EE_B' VB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvA1 : lookupScopes X EE_A' VA Lev : lookupScopes X SG public EvB : lookupScopes X EE_B' VB ============================ VA = VB
< LB: apply public_equiv_lookupScopes to PE _ _ _ Lev EvA1. Subgoal 8.5.22: Variables: SF SG PC FE EE_A' VA EE_B' VB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvA1 : lookupScopes X EE_A' VA Lev : lookupScopes X SG public EvB : lookupScopes X EE_B' VB LB : lookupScopes X EE_B' VA ============================ VA = VB
< apply lookupScopes_unique to EvB LB. Subgoal 8.5.22: Variables: SF SG PC FE EE_A' VA EE_B' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvA1 : lookupScopes X EE_A' VA Lev : lookupScopes X SG public EvB : lookupScopes X EE_B' VA LB : lookupScopes X EE_B' VA ============================ VA = VA
< search. Subgoal 8.5.23: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) public EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA ============================ VA = VB
< case IsE. Subgoal 8.5.23: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) public EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ VA = VB
< EvB: case EvB. Subgoal 8.5.23: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) public EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB ============================ VA = VB
< Lev: case Lev. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs ============================ VA = VB
< LAV: apply IH_A_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 ============================ VA = VB
< apply lookup_unique to EvB EvA1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 ============================ VA = VB
< FR: case SFC (keep). Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG ============================ VA = VB
< FS: apply FR to Lev EvA1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 ============================ VA = VB
< PE': apply zip_level_arg_vals to LAV EvA3 EvB2 FS. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] ============================ VA = VB
< apply public_equiv_add_public to PE' with X = RetVar V = RVVal. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] ============================ VA = VB
< IsFP: apply lookup_is_value_funCtx to _ EvA1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ VA = VB
< IsF: case IsFP. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ VA = VB
< IsF: case IsF1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ VA = VB
< IsF: case IsF2. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ VA = VB
< apply evalArgs_isValue to _ _ _ EvA2. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals ============================ VA = VB
< apply evalArgs_isValue to _ _ _ EvB1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 ============================ VA = VB
< apply zip_is to _ _ EvA3. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv ============================ VA = VB
< apply zip_is to _ _ EvB2. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 ============================ VA = VB
< apply zip_names_same to _ _ with ZA = (RetVar, RVVal)::InitEnv1 ZB = (RetVar, public)::ZP. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] ============================ VA = VB
< apply zip_names_same to _ _ with ZA = (RetVar, RVVal)::InitEnv ZB = (RetVar, public)::ZP. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] ============================ VA = VB
< apply levelArgs_is to _ _ _ Lev1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs ============================ VA = VB
< apply zip_is_sec to _ _ _ with Z = (RetVar, public)::ZP. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) ============================ VA = VB
< PEF: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ FS1 EvA4 EvB3. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv SG1 EE2 EE1 ============================ VA = VB
< SOS: apply secure_older_scopes to _ _ _ FS1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L ============================ VA = VB
< LS: apply SOS to _ with X = RetVar. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L LS : lookup Scope' RetVar public ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvA4. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L LS : lookup Scope' RetVar public H12 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvB3. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L LS : lookup Scope' RetVar public H12 : is_list (is_list (is_pair is_string is_value)) EE2 H13 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB
< apply secure_eval_names_same to _ _ _ _ _ _ EvA4 FS1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L LS : lookup Scope' RetVar public H12 : is_list (is_list (is_pair is_string is_value)) EE2 H13 : is_list (is_list (is_pair is_string is_value)) EE1 H14 : names_same EE2 [Scope'] ============================ VA = VB
< apply secure_eval_names_same to _ _ _ _ _ _ EvB3 FS1. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L LS : lookup Scope' RetVar public H12 : is_list (is_list (is_pair is_string is_value)) EE2 H13 : is_list (is_list (is_pair is_string is_value)) EE1 H14 : names_same EE2 [Scope'] H15 : names_same EE1 [Scope'] ============================ VA = VB
< LB: apply public_equiv_lookupScopes to PEF _ _ _ _ EvA6. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L LS : lookup Scope' RetVar public H12 : is_list (is_list (is_pair is_string is_value)) EE2 H13 : is_list (is_list (is_pair is_string is_value)) EE1 H14 : names_same EE2 [Scope'] H15 : names_same EE1 [Scope'] LB : lookupScopes RetVar EE1 VA ============================ VA = VB
< apply lookupScopes_unique to EvB5 LB. Subgoal 8.5.23: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VA Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs LAV : level_arg_vals ArgLevs ArgVals ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body [Scope'] PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H3 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list is_value ArgVals H5 : is_list is_value ArgVals1 H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, public)::ZP] H9 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, public)::ZP] H10 : is_list is_slev ArgLevs H11 : is_list (is_pair is_string is_slev) ((RetVar, public)::ZP) PEF : public_equiv [Scope'] EE2 EE1 SOS : forall X L, lookup ((RetVar, public)::ZP) X L -> lookup Scope' X L LS : lookup Scope' RetVar public H12 : is_list (is_list (is_pair is_string is_value)) EE2 H13 : is_list (is_list (is_pair is_string is_value)) EE1 H14 : names_same EE2 [Scope'] H15 : names_same EE1 [Scope'] LB : lookupScopes RetVar EE1 VA ============================ VA = VA
< search. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (stmtExpr S E1) public EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ VA = VB
< case IsE. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (stmtExpr S E1) public EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 ============================ VA = VB
< Lev: case Lev. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public ============================ VA = VB
< EvB: case EvB. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB
< apply names_same_add_scope to NSA. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) ============================ VA = VB
< apply names_same_add_scope to NSB. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) ============================ VA = VB
< apply public_equiv_add_scope to PE. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) ============================ VA = VB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply secure_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG2 ============================ VA = VB
< apply secure_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG2 H10 : names_same EE2 SG2 ============================ VA = VB
< apply secure_is to _ _ _ Lev. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG2 H10 : names_same EE2 SG2 H11 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ VA = VB
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.5.24: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VB EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VB (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 public EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : public_equiv SG2 EE1 EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE1 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : names_same EE1 SG2 H10 : names_same EE2 SG2 H11 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ VB = VB
< search. Subgoal 8.5.25: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (recBuild RF) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recBuild RF) public EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * ============================ recVal VF = VB
< case IsE. Subgoal 8.5.25: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recBuild RF) public EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF ============================ recVal VF = VB
< Lev: case Lev. Subgoal 8.5.25: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF public ============================ recVal VF = VB
< EvB: case EvB. Subgoal 8.5.25: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF public EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ recVal VF = recVal VF1
< apply IH_RF_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.25: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB RF VF1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF1) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF1 EE_A' OA * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF public EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ recVal VF1 = recVal VF1
< search. Subgoal 8.5.26: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr (recFieldAccess Rec F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recFieldAccess Rec F) public EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA ============================ VA = VB
< case IsE. Subgoal 8.5.26: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recFieldAccess Rec F) public EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ VA = VB
< Lev: case Lev. Subgoal 8.5.26: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec public ============================ VA = VB
< EvB: case EvB. Subgoal 8.5.26: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec public EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ VA = VB
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.5.26: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields1) EE_A' OA * EvA2 : lookup Fields1 F VA H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec public EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ VA = VB
< apply lookup_unique to EvA2 EvB1. Subgoal 8.5.26: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VB EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields1) EE_A' OA * EvA2 : lookup Fields1 F VB H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec public EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ VB = VB
< search. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC <unknown K evalExpr> public EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * ============================ VA = VB
< Lev: case Lev. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public ============================ VA = VB
< apply names_is to _ EvA1. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names ============================ VA = VB
< apply names_is_sec to _ Lev. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ VA = VB
< apply proj_expr_unique to Lev1 EvA2 _ _ _ _ _. Subgoal 8.5.27.1: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 8.5.27.1: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NSA EvA1 Lev M. Subgoal 8.5.27.1: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 8.5.27.2: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 8.5.27.2: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NSA EvA1 Lev M. Subgoal 8.5.27.2: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 public H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ VA = VB
< apply proj_expr_is to Lev1 _ _. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P ============================ VA = VB
< NSB-: apply names_same_symmetric to NSB. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B ============================ VA = VB
< NSAB: apply names_same_transitive to NSA NSB-. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B ============================ VA = VB
< NamesB: apply names_exists to IsEE_B. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N ============================ VA = VB
< apply names_is to _ EvA1. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names ============================ VA = VB
< apply names_is to _ NamesB. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N ============================ VA = VB
< PrB: apply proj_expr_other to EvA2 _ _ _ with L' = N. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ VA = VB
< apply proj_expr_unique to EvA2 PrB _ _ _ _ _. Subgoal 8.5.27.3: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ forall X, mem X N -> mem X Names
< intros M. Subgoal 8.5.27.3: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N ============================ mem X Names
< NSBA: apply names_same_symmetric to NSAB. Subgoal 8.5.27.3: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N NSBA : names_same EE_B EE_A ============================ mem X Names
< apply names_same_names to NSBA NamesB EvA1 M. Subgoal 8.5.27.3: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N NSBA : names_same EE_B EE_A H6 : mem X Names ============================ mem X Names
< search. Subgoal 8.5.27.4: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ forall X, mem X Names -> mem X N
< intros M. Subgoal 8.5.27.4: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X Names ============================ mem X N
< apply names_same_names to NSAB EvA1 NamesB M. Subgoal 8.5.27.4: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X Names H6 : mem X N ============================ mem X N
< search. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ VA = VB
< EvB': apply proj_evalExpr_forward to PrB NamesB _ _ _ EvB. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' ============================ VA = VB
< EvA': apply proj_evalExpr_forward to EvA2 EvA1 _ _ _ EvA. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' EE''1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' VA EE''1 OA EvA'1 : scopes_same EE_A' EE''1 ============================ VA = VB
< apply evalExpr_unique to _ _ _ EvA' EvA3. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P ============================ V_P = VB
< apply proj_expr_is to PrB _ _. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' ============================ V_P = VB
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA3 EvB'. Subgoal 8.5.27: Variables: SF SG PC FE EE_A EE_A' EE_B EE_B' VB OB Names EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VB EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' VB EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' public H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' VB EE_P O_P EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' ============================ VB = VB
< search. Subgoal 8.6.1: Variables: SF SG PC FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : levelRecFields SF SG PC nilRecFieldExprs public EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' OB ============================ [] = VB
< case EvB. Subgoal 8.6.1: Variables: SF SG PC FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : levelRecFields SF SG PC nilRecFieldExprs public EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ ============================ [] = []
< search. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) public EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ (F, V)::VRest = VB
< case IsRF. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) public EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ (F, V)::VRest = VB
< Lev: case Lev. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E LE LRF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public ============================ (F, V)::VRest = VB
< EvB: case EvB. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ (F, V)::VRest = (F, V1)::VRest1
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 ============================ (F, V)::VRest = (F, V1)::VRest1
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ (F, V)::VRest = (F, V1)::VRest1
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ (F, V)::VRest = (F, V1)::VRest1
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG ============================ (F, V)::VRest = (F, V1)::VRest1
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG ============================ (F, V)::VRest = (F, V1)::VRest1
< apply level_is to _ _ _ Lev. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG H9 : is_slev LE ============================ (F, V)::VRest = (F, V1)::VRest1
< apply levelRecFields_is to _ _ _ Lev1. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG H9 : is_slev LE H10 : is_slev LRF ============================ (F, V)::VRest = (F, V1)::VRest1
< apply join_public to _ _ Lev2. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E public Lev1 : levelRecFields SF SG PC Rest public Lev2 : join public public public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG H9 : is_slev public H10 : is_slev public ============================ (F, V)::VRest = (F, V1)::VRest1
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest F Rest E EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E public Lev1 : levelRecFields SF SG PC Rest public Lev2 : join public public public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG H9 : is_slev public H10 : is_slev public ============================ (F, V1)::VRest = (F, V1)::VRest1
< apply IH_RF_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.6.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 F Rest E EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V1)::VRest1) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest1 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E public Lev1 : levelRecFields SF SG PC Rest public Lev2 : join public public public EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : public_equiv SG EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : names_same EE1 SG H8 : names_same EE2 SG H9 : is_slev public H10 : is_slev public ============================ (F, V1)::VRest1 = (F, V1)::VRest1
< search. Subgoal 8.6.3: Variables: SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsRF : is_recFieldExprs <unknown K evalRecFields> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC <unknown K evalRecFields> public EvA : evalRecFields FE EE_A <unknown K evalRecFields> VA EE_A' OA @ EvB : evalRecFields FE EE_B <unknown K evalRecFields> VB EE_B' OB ============================ VA = VB
< case Lev. Subgoal 8.7.1: Variables: SF SG PC Ls FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : levelArgs SF SG PC nilArgs Ls EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' OB ============================ level_arg_vals Ls [] VB
< case EvB. Subgoal 8.7.1: Variables: SF SG PC Ls FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : levelArgs SF SG PC nilArgs Ls EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ ============================ level_arg_vals Ls [] []
< case Lev. Subgoal 8.7.1: Variables: SF SG PC FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ ============================ level_arg_vals [] [] []
< search. Subgoal 8.7.2: Variables: SF SG PC Ls FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args (consArgs E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC (consArgs E Rest) Ls EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ level_arg_vals Ls (V::VRest) VB
< case IsA. Subgoal 8.7.2: Variables: SF SG PC Ls FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC (consArgs E Rest) Ls EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest ============================ level_arg_vals Ls (V::VRest) VB
< Lev: case Lev. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E Rest1 L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 ============================ level_arg_vals (L::Rest1) (V::VRest) VB
< EvB: case EvB. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply level_is to _ _ _ Lev. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply levelArgs_is to _ _ _ Lev1. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L H9 : is_list is_slev Rest1 ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< Or: apply is_slev_public_or_not to _ with L = L. Subgoal 8.7.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L H9 : is_list is_slev Rest1 Or : L = public \/ (L = public -> false) ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< N: case Or. Subgoal 8.7.2.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E public Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_list is_slev Rest1 ============================ level_arg_vals (public::Rest1) (V::VRest) (V1::VRest1)
< apply IH_E_L to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 8.7.2.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest Rest E Rest1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E public Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_list is_slev Rest1 ============================ level_arg_vals (public::Rest1) (V1::VRest) (V1::VRest1)
< apply IH_A_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.7.2.1: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest Rest E Rest1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V1::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V1 EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E public Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev public H9 : is_list is_slev Rest1 H10 : level_arg_vals Rest1 VRest VRest1 ============================ level_arg_vals (public::Rest1) (V1::VRest) (V1::VRest1)
< search. Subgoal 8.7.2.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L H9 : is_list is_slev Rest1 N : L = public -> false ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< apply IH_A_L to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 8.7.2.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : is_slev L H9 : is_list is_slev Rest1 N : L = public -> false H10 : level_arg_vals Rest1 VRest VRest1 ============================ level_arg_vals (L::Rest1) (V::VRest) (V1::VRest1)
< search. Subgoal 8.7.3: Variables: SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> public_equiv SG' EE_A' EE_B' IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> public_equiv SG EE_A' EE_B' IH_E_L : forall E SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E public -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB IH_RF_L : forall RF SF SG PC FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF public -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB IH_A_L : forall A SF SG PC Ls FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A Ls -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> level_arg_vals Ls VA VB IsA : is_args <unknown K evalArgs> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC <unknown K evalArgs> Ls EvA : evalArgs FE EE_A <unknown K evalArgs> VA EE_A' OA @ EvB : evalArgs FE EE_B <unknown K evalArgs> VB EE_B' OB ============================ level_arg_vals Ls VA VB
< case Lev. Proof completed.
< Extensible_Theorem stmt_not_public_no_output : forall S SF SG PC SG' FE Scope EE EE' O, IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (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) -> SFC : secFunCtxs SF FE -> NS : names_same (Scope::EE) SG -> Ev : evalStmt FE (Scope::EE) S EE' O -> Sec : secure SF SG PC S SG' -> NEq : (PC = public -> false) -> O = [] on Ev as IH_S, expr_not_public_no_output : forall E SF SG PC L FE EE V EE' O, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> SFC : secFunCtxs SF FE -> NS : names_same EE SG -> Ev : evalExpr FE EE E V EE' O -> Lev : level SF SG PC E L -> NEq : (PC = public -> false) -> O = [] on Ev as IH_E, args_not_public_no_output : forall A SF SG PC L FE EE V EE' O, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> SFC : secFunCtxs SF FE -> NS : names_same EE SG -> Ev : evalArgs FE EE A V EE' O -> Lev : levelArgs SF SG PC A L -> NEq : (PC = public -> false) -> O = [] on Ev as IH_A, recFields_not_public_no_output : forall RF SF SG PC L FE EE V EE' O, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> SFC : secFunCtxs SF FE -> NS : names_same EE SG -> Ev : evalRecFields FE EE RF V EE' O -> Lev : levelRecFields SF SG PC RF L -> NEq : (PC = public -> false) -> O = [] on Ev as IH_RF. Subgoal 1: Variables: S SF SG PC SG' FE Scope EE EE' O IsS : is_stmt S IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) S EE' O Sec : secure SF SG PC S SG' NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_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) /\ is_stmt S)
< search. Subgoal 2: Variables: E SF SG PC L FE EE V EE' O IsE : is_expr E IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE E V EE' O Lev : level SF SG PC E L NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 3: Variables: A SF SG PC L FE EE V EE' O IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE A V EE' O Lev : levelArgs SF SG PC A L NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 4: Variables: RF SF SG PC L FE EE V EE' O IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE RF V EE' O Lev : levelRecFields SF SG PC RF L NEq : PC = public -> false ============================ is_list (is_pair is_string (is_pair is_string (is_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)
< search. Subgoal 5.1.1: Variables: SF SG PC SG' FE Scope EE IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) noop (Scope::EE) [] @ Sec : secure SF SG PC noop SG' NEq : PC = public -> false ============================ [] = []
< search. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Sec : secure SF SG PC (seq S1 S2) SG' NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsS. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ Sec : secure SF SG PC (seq S1 S2) SG' NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 ============================ O = []
< Sec: case Sec. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 O3 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 O2 * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O3 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 [] * Ev2 : evalStmt FE EE3 S2 EE' O3 * Ev3 : [] ++ O3 = O H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' ============================ O = []
< case Ev3. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 [] * Ev2 : evalStmt FE EE3 S2 EE' O * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' ============================ O = []
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 [] * Ev2 : evalStmt FE EE3 S2 EE' O * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply secure_is to _ _ _ Sec. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 [] * Ev2 : evalStmt FE EE3 S2 EE' O * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_slev)) SG3 ============================ O = []
< NS': apply secure_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.2: Variables: SF SG PC SG' FE Scope EE EE' O EE3 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 [] * Ev2 : evalStmt FE EE3 S2 EE' O * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_slev)) SG3 NS' : names_same EE3 SG3 ============================ O = []
< case NS. Subgoal 5.1.2: Variables: SF PC SG' FE Scope EE EE' O EE3 S2 S1 SG3 BRest B IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 [] * Ev2 : evalStmt FE EE3 S2 EE' O * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_slev)) SG3 NS' : names_same EE3 SG3 H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest ============================ O = []
< apply secure_older_scopes to _ _ _ Sec. Subgoal 5.1.2: Variables: SF PC SG' FE Scope EE EE' O EE3 S2 S1 BRest B Scope' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 EE3 [] * Ev2 : evalStmt FE EE3 S2 EE' O * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NS' : names_same EE3 (Scope'::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest H8 : forall X L, lookup B X L -> lookup Scope' X L ============================ O = []
< case NS' (keep). Subgoal 5.1.2: Variables: SF PC SG' FE Scope EE EE' O S2 S1 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) [] * Ev2 : evalStmt FE (A::ARest) S2 EE' O * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NS' : names_same (A::ARest) (Scope'::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest H8 : forall X L, lookup B X L -> lookup Scope' X L H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H10 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H11 : names_same ARest BRest ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev2 Sec1 _. Subgoal 5.1.2: Variables: SF PC SG' FE Scope EE EE' S2 S1 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) (seq S1 S2) EE' [] @ NEq : PC = public -> false Ev1 : evalStmt FE (Scope::EE) S1 (A::ARest) [] * Ev2 : evalStmt FE (A::ARest) S2 EE' [] * H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' H3 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H4 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NS' : names_same (A::ARest) (Scope'::BRest) H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H7 : names_same EE BRest H8 : forall X L, lookup B X L -> lookup Scope' X L H9 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H10 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H11 : names_same ARest BRest ============================ [] = []
< search. Subgoal 5.1.3: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (declare Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * ============================ O = []
< case IsS. Subgoal 5.1.3: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (declare Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ O = []
< Sec: case Sec. Subgoal 5.1.3: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.3: Variables: SF FE Scope EE EE2 Scope1 V X E Ty SG1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope1)::EE2) [] @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) [] * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X ============================ [] = []
< search. Subgoal 5.1.4: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 E X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Sec : secure SF SG PC (assign X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' ============================ O = []
< case IsS. Subgoal 5.1.4: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 E X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ Sec : secure SF SG PC (assign X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E ============================ O = []
< Sec: case Sec. Subgoal 5.1.4.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 E X L IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.4.1: Variables: SF PC SG' FE Scope EE EE' V EE3 E X L IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 [] * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private ============================ [] = []
< search. Subgoal 5.1.4.2: Variables: SF SG' FE Scope EE EE' O V EE3 E X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.4.2: Variables: SF SG' FE Scope EE EE' V EE3 E X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (assign X E) EE' [] @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 [] * Ev2 : replaceScopes X V EE3 EE' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public ============================ [] = []
< search. Subgoal 5.1.5: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Sec : secure SF SG PC (recUpdate Rec Fields E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' ============================ O = []
< case IsS. Subgoal 5.1.5: Variables: SF SG PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ Sec : secure SF SG PC (recUpdate Rec Fields E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ O = []
< Sec: case Sec. Subgoal 5.1.5.1: Variables: SF PC SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec L IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.5.1: Variables: SF PC SG' FE Scope EE EE' V EE3 FieldVals NewVals E Fields Rec L IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 [] * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private ============================ [] = []
< search. Subgoal 5.1.5.2: Variables: SF SG' FE Scope EE EE' O V EE3 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 O * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.5.2: Variables: SF SG' FE Scope EE EE' V EE3 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (recUpdate Rec Fields E) EE' [] @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V EE3 [] * Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals) Ev3 : updateRecFields Fields V FieldVals NewVals Ev4 : replaceScopes Rec (recVal NewVals) EE3 EE' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public ============================ [] = []
< search. Subgoal 5.1.6: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsS. Subgoal 5.1.6: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ O = []
< Sec: case Sec. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O3 * Ev3 : [] ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ O = []
< case Ev3. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply level_is to _ _ _ Sec. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L ============================ O = []
< apply join_is to _ _ Sec1. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 ============================ O = []
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' ============================ O = []
< apply names_same_add_scope to NS'. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ O = []
< assert Sl1 = public -> false. Subgoal 5.1.6.1: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ Sl1 = public -> false
< intros E. Subgoal 5.1.6.1: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') E : Sl1 = public ============================ false
< case E. Subgoal 5.1.6.1: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev public NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ false
< apply join_public to _ _ Sec1. Subgoal 5.1.6.1: Variables: SF SG' FE Scope EE EE' O EE3 Scope1 El Th Cond SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' public Cond public Sec1 : join public public public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ false
< backchain NEq. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') H8 : Sl1 = public -> false ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev2 Sec2 _. Subgoal 5.1.6: Variables: SF PC SG' FE Scope EE EE' EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) Th (Scope1::EE') [] * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') H8 : Sl1 = public -> false ============================ [] = []
< search. Subgoal 5.1.7: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsS. Subgoal 5.1.7: Variables: SF SG PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ Sec : secure SF SG PC (ifThenElse Cond Th El) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ O = []
< Sec: case Sec. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 O2 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 O2 * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 O3 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O3 * Ev3 : [] ++ O3 = O H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ O = []
< case Ev3. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply level_is to _ _ _ Sec. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L ============================ O = []
< apply join_is to _ _ Sec1. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 ============================ O = []
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' ============================ O = []
< apply names_same_add_scope to NS'. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ O = []
< assert Sl1 = public -> false. Subgoal 5.1.7.1: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ Sl1 = public -> false
< intros E. Subgoal 5.1.7.1: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') E : Sl1 = public ============================ false
< case E. Subgoal 5.1.7.1: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev public NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ false
< apply join_public to _ _ Sec1. Subgoal 5.1.7.1: Variables: SF SG' FE Scope EE EE' O EE3 Scope1 El Th Cond SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' public Cond public Sec1 : join public public public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') ============================ false
< backchain NEq. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' O EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') O * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') H8 : Sl1 = public -> false ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev2 Sec3 _. Subgoal 5.1.7: Variables: SF PC SG' FE Scope EE EE' EE3 Scope1 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (ifThenElse Cond Th El) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE3 [] * Ev2 : evalStmt FE ([]::EE3) El (Scope1::EE') [] * H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L H6 : is_slev Sl1 NS' : names_same EE3 SG' H7 : names_same ([]::EE3) ([]::SG') H8 : Sl1 = public -> false ============================ [] = []
< search. Subgoal 5.1.8: Variables: SF SG PC SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O ============================ O = []
< case IsS. Subgoal 5.1.8: Variables: SF SG PC SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body ============================ O = []
< Sec: case Sec (keep). Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec1 _. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 O3 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : [] ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) ============================ O = []
< case Ev4. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O12 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O12 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O = []
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev1 Sec1. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O12 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' ============================ O = []
< apply names_same_add_scope to NS'. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 O4 O12 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O12 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev2 Sec2 _. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 O4 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev5 : [] ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') ============================ O = []
< case Ev5. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') ============================ O = []
< IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE4) ============================ O = []
< case IsEE4+. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ O = []
< NS+: apply secure_eval_names_same to _ _ _ _ _ _ Ev2 Sec2. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 Body Cond L Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope2::SG2) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 NS+ : names_same (Scope1::EE4) (Scope2::SG2) ============================ O = []
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 Body Cond L Scope' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 NS+ : names_same (Scope1::EE4) (Scope'::SG') H7 : forall X L, lookup [] X L -> lookup Scope' X L ============================ O = []
< NS-: case NS+. Subgoal 5.1.8.1: Variables: SF SG' FE Scope EE EE' O EE2 Scope1 EE4 Body Cond L Scope' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' private (while Cond Body) SG' NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope'::SG') H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 SG' H4 : names_same ([]::EE2) ([]::SG') H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X L, lookup [] X L -> lookup Scope' X L NS- : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS-2 : names_same EE4 SG' ============================ O = []
< case NS. Subgoal 5.1.8.1: Variables: SF FE Scope EE EE' O EE2 Scope1 EE4 Body Cond L Scope' BRest B IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) [] * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 (B::BRest) H4 : names_same ([]::EE2) ([]::(B::BRest)) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE4 H7 : forall X L, lookup [] X L -> lookup Scope' X L NS- : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS-2 : names_same EE4 (B::BRest) H8 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H9 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H10 : names_same EE BRest ============================ O = []
< case NS-2 (keep). Subgoal 5.1.8.1: Variables: SF FE Scope EE EE' O EE2 Scope1 Body Cond L Scope' BRest B ARest A IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::(A::ARest)) [] * Ev3 : evalStmt FE (A::ARest) (while Cond Body) EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 (B::BRest) H4 : names_same ([]::EE2) ([]::(B::BRest)) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H7 : forall X L, lookup [] X L -> lookup Scope' X L NS- : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS-2 : names_same (A::ARest) (B::BRest) H8 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H9 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H10 : names_same EE BRest H11 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H12 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H13 : names_same ARest BRest ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev3 Sec _. Subgoal 5.1.8.1: Variables: SF FE Scope EE EE' EE2 Scope1 Body Cond L Scope' BRest B ARest A IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' [] @ Sec : secure SF (B::BRest) private (while Cond Body) (B::BRest) NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 [] * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::(A::ARest)) [] * Ev3 : evalStmt FE (A::ARest) (while Cond Body) EE' [] * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) private Cond L Sec2 : secure SF ([]::(B::BRest)) private Body (Scope'::(B::BRest)) H3 : is_list (is_list (is_pair is_string is_value)) EE2 NS' : names_same EE2 (B::BRest) H4 : names_same ([]::EE2) ([]::(B::BRest)) H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H7 : forall X L, lookup [] X L -> lookup Scope' X L NS- : forall X IA, mem (X, IA) Scope1 -> exists IB, mem (X, IB) Scope' NS-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope1 NS-2 : names_same (A::ARest) (B::BRest) H8 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H9 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H10 : names_same EE BRest H11 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H12 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H13 : names_same ARest BRest ============================ [] = []
< search. Subgoal 5.1.8.2: Variables: SF SG' FE Scope EE EE' O EE2 O2 Scope1 EE4 O3 O4 O12 Body Cond Scope2 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG' public (while Cond Body) SG' NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond trueVal EE2 O2 * Ev2 : evalStmt FE ([]::EE2) Body (Scope1::EE4) O3 * Ev3 : evalStmt FE EE4 (while Cond Body) EE' O4 * Ev4 : O2 ++ O3 = O12 Ev5 : O12 ++ O4 = O H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope2::SG2) ============================ O = []
< apply NEq to _. Subgoal 5.1.9: Variables: SF SG PC SG' FE Scope EE EE' O Body Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * ============================ O = []
< case IsS. Subgoal 5.1.9: Variables: SF SG PC SG' FE Scope EE EE' O Body Cond IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ Sec : secure SF SG PC (while Cond Body) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body ============================ O = []
< Sec: case Sec. Subgoal 5.1.9.1: Variables: SF SG' FE Scope EE EE' O Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec : level SF SG' private Cond L Sec1 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.9.1: Variables: SF SG' FE Scope EE EE' Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' [] @ NEq : private = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' [] * H1 : is_expr Cond H2 : is_stmt Body Sec : level SF SG' private Cond L Sec1 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ [] = []
< search. Subgoal 5.1.9.2: Variables: SF SG' FE Scope EE EE' O Body Cond Scope1 SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (while Cond Body) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) Cond falseVal EE' O * H1 : is_expr Cond H2 : is_stmt Body Sec : level SF SG' public Cond public Sec1 : secure SF ([]::SG') public Body (Scope1::SG2) ============================ O = []
< apply NEq to _. Subgoal 5.1.10: Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Sec : secure SF SG PC (scopeStmt S1) SG' NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * ============================ O = []
< case IsS. Subgoal 5.1.10: Variables: SF SG PC SG' FE Scope EE EE' O Scope1 S1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ Sec : secure SF SG PC (scopeStmt S1) SG' NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 ============================ O = []
< Sec: case Sec. Subgoal 5.1.10: Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope2::SG') ============================ O = []
< apply names_same_add_scope to NS. Subgoal 5.1.10: Variables: SF PC SG' FE Scope EE EE' O Scope1 S1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') O * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope2::SG') H2 : names_same ([]::(Scope::EE)) ([]::SG') ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.10: Variables: SF PC SG' FE Scope EE EE' Scope1 S1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (scopeStmt S1) EE' [] @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::(Scope::EE)) S1 (Scope1::EE') [] * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope2::SG') H2 : names_same ([]::(Scope::EE)) ([]::SG') ============================ [] = []
< search. Subgoal 5.1.11: Variables: SF SG PC SG' FE Scope EE EE' O I O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O ============================ O = []
< case Sec. Subgoal 5.1.11: Variables: SF SG' FE Scope EE EE' O I O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E (intVal I) EE' O2 * Ev2 : O2 ++ [intVal I] = O H1 : level SF SG' public E public ============================ O = []
< apply NEq to _. Subgoal 5.1.12: Variables: SF SG PC SG' FE Scope EE EE' O O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O ============================ O = []
< case Sec. Subgoal 5.1.12: Variables: SF SG' FE Scope EE EE' O O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O2 * Ev2 : O2 ++ [trueVal] = O H1 : level SF SG' public E public ============================ O = []
< apply NEq to _. Subgoal 5.1.13: Variables: SF SG PC SG' FE Scope EE EE' O O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O ============================ O = []
< case Sec. Subgoal 5.1.13: Variables: SF SG' FE Scope EE EE' O O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E falseVal EE' O2 * Ev2 : O2 ++ [falseVal] = O H1 : level SF SG' public E public ============================ O = []
< apply NEq to _. Subgoal 5.1.14: Variables: SF SG PC SG' FE Scope EE EE' O S1 O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ Sec : secure SF SG PC (printVal E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O ============================ O = []
< case Sec. Subgoal 5.1.14: Variables: SF SG' FE Scope EE EE' O S1 O2 E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG' Ev : evalStmt FE (Scope::EE) (printVal E) EE' O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) EE' O2 * Ev2 : O2 ++ [stringVal S1] = O H1 : level SF SG' public E public ============================ O = []
< apply NEq to _. Subgoal 5.1.15: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty L IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt (secdecl L Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (secdecl L Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * ============================ O = []
< case IsS. Subgoal 5.1.15: Variables: SF SG PC SG' FE Scope EE O EE2 Scope1 V X E Ty L IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) (secdecl L Ty X E) (((X, V)::Scope1)::EE2) O @ Sec : secure SF SG PC (secdecl L Ty X E) SG' NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ O = []
< Sec: case Sec. Subgoal 5.1.15.1: Variables: SF PC FE Scope EE O EE2 Scope1 V X E Ty L1 SG1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) O @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Sec _. Subgoal 5.1.15.1: Variables: SF PC FE Scope EE EE2 Scope1 V X E Ty L1 SG1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl private Ty X E) (((X, V)::Scope1)::EE2) [] @ NEq : PC = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) [] * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) PC E L1 Sec1 : no_lookup Scope2 X ============================ [] = []
< search. Subgoal 5.1.15.2: Variables: SF FE Scope EE O EE2 Scope1 V X E Ty SG1 Scope2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope2::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) (Scope2::SG1) Ev : evalStmt FE (Scope::EE) (secdecl public Ty X E) (((X, V)::Scope1)::EE2) O @ NEq : public = public -> false Ev1 : evalExpr FE (Scope::EE) E V (Scope1::EE2) O * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope2::SG1) public E public Sec1 : no_lookup Scope2 X ============================ O = []
< apply NEq to _. Subgoal 5.1.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ Sec : secure SF SG PC <unknown K evalStmt> SG' NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * ============================ O = []
< Sec: case Sec. Subgoal 5.1.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' ============================ O = []
< apply names_is to _ Ev1. Subgoal 5.1.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names ============================ O = []
< apply names_is_sec to _ Sec. Subgoal 5.1.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ O = []
< apply proj_stmt_unique to Sec1 Ev2 _ _ _ _ _. Subgoal 5.1.16.1: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.1.16.1: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NS Ev1 Sec M. Subgoal 5.1.16.1: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.1.16.2: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.1.16.2: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NS Ev1 Sec M. Subgoal 5.1.16.2: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.1.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ O = []
< apply proj_stmt_is to Sec1 _ _. Subgoal 5.1.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P ============================ O = []
< NS': apply secure_eval_names_same to _ _ _ _ _ _ Ev3 Sec2. Subgoal 5.1.16: Variables: SF SG PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE NS : names_same (Scope::EE) SG Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' ============================ O = []
< case NS. Subgoal 5.1.16: Variables: SF PC SG' FE Scope EE EE' O Names S_P EE_P O_P Names1 BRest B IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P SG' H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H6 : names_same EE BRest ============================ O = []
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.1.16: Variables: SF PC FE Scope EE EE' O Names S_P EE_P O_P Names1 BRest B Scope' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same EE_P (Scope'::BRest) H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H6 : names_same EE BRest H7 : forall X L, lookup B X L -> lookup Scope' X L ============================ O = []
< case NS' (keep). Subgoal 5.1.16: Variables: SF PC FE Scope EE EE' O Names S_P O_P Names1 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'::BRest) H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H6 : names_same EE BRest H7 : forall X L, lookup B X L -> lookup Scope' X L H8 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H9 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H10 : names_same ARest BRest ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev3 Sec2 _. Subgoal 5.1.16: Variables: SF PC FE Scope EE EE' O Names S_P Names1 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) [] * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'::BRest) H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H6 : names_same EE BRest H7 : forall X L, lookup B X L -> lookup Scope' X L H8 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H9 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H10 : names_same ARest BRest ============================ O = []
< SS: apply proj_evalStmt_forward to Ev2 Ev1 _ _ _ Ev. Subgoal 5.1.16: Variables: SF PC FE Scope EE EE' O Names S_P Names1 BRest B Scope' ARest A EE'' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' O @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) [] * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'::BRest) H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H6 : names_same EE BRest H7 : forall X L, lookup B X L -> lookup Scope' X L H8 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H9 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H10 : names_same ARest BRest SS : evalStmt FE (Scope::EE) S_P EE'' O SS1 : scopes_same EE' EE'' ============================ O = []
< apply evalStmt_unique to _ _ _ SS Ev3. Subgoal 5.1.16: Variables: SF PC FE Scope EE EE' Names S_P Names1 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (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) SFC : secFunCtxs SF FE Ev : evalStmt FE (Scope::EE) <unknown K evalStmt> EE' [] @ NEq : PC = public -> false Ev1 : names (Scope::EE) Names Ev2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P Ev3 : evalStmt FE (Scope::EE) S_P (A::ARest) [] * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P NS' : names_same (A::ARest) (Scope'::BRest) H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H6 : names_same EE BRest H7 : forall X L, lookup B X L -> lookup Scope' X L H8 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H9 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H10 : names_same ARest BRest SS : evalStmt FE (Scope::EE) S_P (A::ARest) [] SS1 : scopes_same EE' (A::ARest) ============================ [] = []
< search. Subgoal 5.2.1: Variables: SF SG PC L FE EE' I IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' SFC : secFunCtxs SF FE NS : names_same EE' SG Ev : evalExpr FE EE' (num I) (intVal I) EE' [] @ Lev : level SF SG PC (num I) L NEq : PC = public -> false ============================ [] = []
< search. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (plus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (plus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 + I2 = I Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 + I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 + I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 + I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.2: Variables: SF SG PC L FE EE EE' I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (plus E1 E2) (intVal I) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' [] * Ev3 : I1 + I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (minus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (minus E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 - I2 = I Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 - I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 - I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 - I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.3: Variables: SF SG PC L FE EE EE' I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (minus E1 E2) (intVal I) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' [] * Ev3 : I1 - I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (mult E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (mult E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 * I2 = I Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 * I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 * I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 * I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.4: Variables: SF SG PC L FE EE EE' I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (mult E1 E2) (intVal I) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' [] * Ev3 : I1 * I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (div E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ Lev : level SF SG PC (div E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 O3 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 / I2 = I Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 / I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 / I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 / I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.5: Variables: SF SG PC L FE EE EE' I1 EE3 I2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (div E1 E2) (intVal I) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' [] * Ev3 : I1 / I2 = I H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.6: Variables: SF SG PC L FE EE' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' SFC : secFunCtxs SF FE NS : names_same EE' SG Ev : evalExpr FE EE' true trueVal EE' [] @ Lev : level SF SG PC true L NEq : PC = public -> false ============================ [] = []
< search. Subgoal 5.2.7: Variables: SF SG PC L FE EE' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' SFC : secFunCtxs SF FE NS : names_same EE' SG Ev : evalExpr FE EE' false falseVal EE' [] @ Lev : level SF SG PC false L NEq : PC = public -> false ============================ [] = []
< search. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< case Ev3. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply level_is to _ _ _ Lev. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ O = []
< apply join_is to _ _ Lev1. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ O = []
< assert Sl1 = public -> false. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.8.1: Variables: SF SG L FE EE EE' O EE3 E2 E1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.8: Variables: SF SG PC L FE EE EE' EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) trueVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' [] * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ [] = []
< search. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ O = []
< case IsE. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.9: Variables: SF SG PC L FE EE EE' E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' [] * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ [] = []
< search. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ Lev : level SF SG PC (and E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< case Ev3. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply level_is to _ _ _ Lev. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ O = []
< apply join_is to _ _ Lev1. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ O = []
< assert Sl1 = public -> false. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.10.1: Variables: SF SG L FE EE EE' O EE3 E2 E1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.10: Variables: SF SG PC L FE EE EE' EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (and E1 E2) falseVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' [] * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ [] = []
< search. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ O = []
< case IsE. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' O E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' O E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.11: Variables: SF SG PC L FE EE EE' E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' [] * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ [] = []
< search. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O3 * Ev3 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< case Ev3. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply level_is to _ _ _ Lev. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ O = []
< apply join_is to _ _ Lev1. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ O = []
< assert Sl1 = public -> false. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.12.1: Variables: SF SG L FE EE EE' O EE3 E2 E1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.12: Variables: SF SG PC L FE EE EE' EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) trueVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 trueVal EE' [] * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ [] = []
< search. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ Lev : level SF SG PC (or E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 O2 * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 O3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O3 * Ev3 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< case Ev3. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply level_is to _ _ _ Lev. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 ============================ O = []
< apply join_is to _ _ Lev1. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ O = []
< assert Sl1 = public -> false. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.13.1: Variables: SF SG L FE EE EE' O EE3 E2 E1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : public = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev public H6 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' O EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev2 _. Subgoal 5.2.13: Variables: SF SG PC L FE EE EE' EE3 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (or E1 E2) falseVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE3 [] * Ev2 : evalExpr FE EE3 E2 falseVal EE' [] * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_slev L2 H6 : is_slev Sl1 H7 : Sl1 = public -> false ============================ [] = []
< search. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * ============================ O = []
< case IsE. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 ============================ O = []
< Lev: case Lev. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.14: Variables: SF SG PC L FE EE EE' E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) trueVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 falseVal EE' [] * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ [] = []
< search. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * ============================ O = []
< case IsE. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ Lev : level SF SG PC (not E1) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 ============================ O = []
< Lev: case Lev. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' O E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' O * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.15: Variables: SF SG PC L FE EE EE' E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (not E1) falseVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 trueVal EE' [] * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ [] = []
< search. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 > I2 Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 > I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 > I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 > I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.16: Variables: SF SG PC L FE EE EE' I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) trueVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' [] * Ev3 : I1 > I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ Lev : level SF SG PC (greater E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 O2 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O3 * Ev3 : I1 <= I2 Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 <= I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 <= I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' O I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' O * Ev3 : I1 <= I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.17: Variables: SF SG PC L FE EE EE' I1 EE3 I2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (greater E1 E2) falseVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (intVal I1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (intVal I2) EE' [] * Ev3 : I1 <= I2 H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V1 EE' O3 * Ev3 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev3. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V1 EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V1 EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' O V1 EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V1 EE' O * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.18: Variables: SF SG PC L FE EE EE' V1 EE3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) trueVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V1 EE' [] * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ Lev : level SF SG PC (eq E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 O2 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 V2 O3 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : V1 = V2 -> false Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 V2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V2 EE' O * Ev3 : V1 = V2 -> false H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 V2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V2 EE' O * Ev3 : V1 = V2 -> false H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' O V1 EE3 V2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V2 EE' O * Ev3 : V1 = V2 -> false H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.19: Variables: SF SG PC L FE EE EE' V1 EE3 V2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (eq E1 E2) falseVal EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 V1 EE3 [] * Ev2 : evalExpr FE EE3 E2 V2 EE' [] * Ev3 : V1 = V2 -> false H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.20: Variables: SF SG PC L FE EE' S IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' SFC : secFunCtxs SF FE NS : names_same EE' SG Ev : evalExpr FE EE' (stringLit S) (stringVal S) EE' [] @ Lev : level SF SG PC (stringLit S) L NEq : PC = public -> false ============================ [] = []
< search. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Lev : level SF SG PC (appString E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ Lev : level SF SG PC (appString E1 E2) L NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ O = []
< Lev: case Lev. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 O2 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 O2 * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 S2 O3 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O3 * Ev3 : S1 ++ S2 = S Ev4 : [] ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< case Ev4. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 S2 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O * Ev3 : S1 ++ S2 = S H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 S2 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O * Ev3 : S1 ++ S2 = S H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' O S1 EE3 S2 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' O * Ev3 : S1 ++ S2 = S H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.21: Variables: SF SG PC L FE EE EE' S1 EE3 S2 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (appString E1 E2) (stringVal S) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E1 (stringVal S1) EE3 [] * Ev2 : evalExpr FE EE3 E2 (stringVal S2) EE' [] * Ev3 : S1 ++ S2 = S H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.2.22: Variables: SF SG PC L FE V EE' X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' SFC : secFunCtxs SF FE NS : names_same EE' SG Ev : evalExpr FE EE' (name X) V EE' [] @ Lev : level SF SG PC (name X) L NEq : PC = public -> false Ev1 : lookupScopes X EE' V ============================ [] = []
< search. Subgoal 5.2.23: Variables: SF SG PC L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Lev : level SF SG PC (call Fun Args) L NEq : PC = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V ============================ O = []
< case IsE. Subgoal 5.2.23: Variables: SF SG PC L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ Lev : level SF SG PC (call Fun Args) L NEq : PC = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args ============================ O = []
< Lev: case Lev. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ O = []
< apply IH_A to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 O3 Args Fun ArgLevs IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : [] ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ O = []
< case Ev5. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ O = []
< apply evalArgs_isValue to _ _ _ Ev2. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals ============================ O = []
< FR: case SFC (keep). Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG ============================ O = []
< FS: apply FR to Lev Ev1. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 ============================ O = []
< IsFP: apply lookup_is_value_funCtx to _ Ev1. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ O = []
< IsF: case IsFP. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ O = []
< IsF: case IsF1. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ O = []
< IsF: case IsF2. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ O = []
< apply zip_is to _ _ Ev3. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list (is_pair is_string is_value) InitEnv ============================ O = []
< apply zip_names_same to _ _ with ZA = (RetVar, RVVal)::InitEnv ZB = (RetVar, private)::ZP. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list (is_pair is_string is_value) InitEnv H5 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] ============================ O = []
< apply levelArgs_is to _ _ _ Lev1. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list (is_pair is_string is_value) InitEnv H5 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] H6 : is_list is_slev ArgLevs ============================ O = []
< apply zip_is_sec to _ _ _ with Z = (RetVar, private)::ZP. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' O RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list (is_pair is_string is_value) InitEnv H5 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] H6 : is_list is_slev ArgLevs H7 : is_list (is_pair is_string is_slev) ((RetVar, private)::ZP) ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev4 FS1 _. Subgoal 5.2.23.1: Variables: SF SG FE EE V EE' RetVar RVVal ArgNames Body ArgVals InitEnv EE3 Args Fun ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' [] @ NEq : private = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' [] * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 [] * Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H4 : is_list (is_pair is_string is_value) InitEnv H5 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] H6 : is_list is_slev ArgLevs H7 : is_list (is_pair is_string is_slev) ((RetVar, private)::ZP) ============================ [] = []
< search. Subgoal 5.2.23.2: Variables: SF SG L FE EE V EE' O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE3 O3 Args Fun ArgLevs IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (call Fun Args) V EE' O @ NEq : public = public -> false Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) Ev2 : evalArgs FE EE Args ArgVals EE' O2 * Ev3 : zip ArgNames ArgVals InitEnv Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE3 O3 * Ev5 : O2 ++ O3 = O Ev6 : lookupScopes RetVar EE3 V H1 : is_string Fun H2 : is_args Args Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs ============================ O = []
< apply NEq to _. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Lev : level SF SG PC (stmtExpr S E1) L NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsE. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ Lev : level SF SG PC (stmtExpr S E1) L NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 ============================ O = []
< Lev: case Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L ============================ O = []
< apply names_same_add_scope to NS. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 O2 Scope O3 E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 O2 * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : O2 ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) ============================ O = []
< apply IH_S to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 Scope O3 E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 [] * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O3 * Ev3 : [] ++ O3 = O H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) ============================ O = []
< case Ev3. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 Scope E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 [] * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O * H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) ============================ O = []
< apply secure_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 Scope E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 [] * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O * H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 ============================ O = []
< apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 Scope E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 [] * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O * H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply secure_is to _ _ _ Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' O EE3 Scope E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' O @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 [] * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') O * H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.2.24: Variables: SF SG PC L FE EE V EE' EE3 Scope E1 S SG2 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (stmtExpr S E1) V EE' [] @ NEq : PC = public -> false Ev1 : evalStmt FE ([]::EE) S EE3 [] * Ev2 : evalExpr FE EE3 E1 V (Scope::EE') [] * H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L H3 : names_same ([]::EE) ([]::SG) H4 : names_same EE3 SG2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ [] = []
< search. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' O VF RF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (recBuild RF) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Lev : level SF SG PC (recBuild RF) L NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' O * ============================ O = []
< case IsE. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' O VF RF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ Lev : level SF SG PC (recBuild RF) L NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF ============================ O = []
< Lev: case Lev. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' O VF RF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' O @ NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' O * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L ============================ O = []
< apply IH_RF to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.25: Variables: SF SG PC L FE EE EE' VF RF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recBuild RF) (recVal VF) EE' [] @ NEq : PC = public -> false Ev1 : evalRecFields FE EE RF VF EE' [] * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L ============================ [] = []
< search. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr (recFieldAccess Rec F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Lev : level SF SG PC (recFieldAccess Rec F) L NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V ============================ O = []
< case IsE. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ Lev : level SF SG PC (recFieldAccess Rec F) L NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F ============================ O = []
< Lev: case Lev. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' O Fields F Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' O * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.2.26: Variables: SF SG PC L FE EE V EE' Fields F Rec IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE (recFieldAccess Rec F) V EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE Rec (recVal Fields) EE' [] * Ev2 : lookup Fields F V H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L ============================ [] = []
< search. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ Lev : level SF SG PC <unknown K evalExpr> L NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * ============================ O = []
< Lev: case Lev. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L ============================ O = []
< apply names_is to _ Ev1. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names ============================ O = []
< apply names_is_sec to _ Lev. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ O = []
< apply proj_expr_unique to Lev1 Ev2 _ _ _ _ _. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NS Ev1 Lev M. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NS Ev1 Lev M. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ O = []
< apply proj_expr_is to Lev1 _ _. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P ============================ O = []
< NS': apply level_eval_names_same to _ _ _ _ _ _ Ev3 Lev2. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev3 Lev2 _. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P [] * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG ============================ O = []
< SS: apply proj_evalExpr_forward to Ev2 Ev1 _ _ _ Ev. Subgoal 5.2.27: Variables: SF SG PC L FE EE V EE' O Names E_P V_P EE_P Names1 EE'' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V EE' O @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P [] * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG SS : evalExpr FE EE E_P V EE'' O SS1 : scopes_same EE' EE'' ============================ O = []
< apply evalExpr_unique to _ _ _ SS Ev3. Subgoal 5.2.27: Variables: SF SG PC L FE EE EE' Names E_P V_P EE_P Names1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalExpr FE EE <unknown K evalExpr> V_P EE' [] @ NEq : PC = public -> false Ev1 : names EE Names Ev2 : Names |{expr}- <unknown K evalExpr> ~~> E_P Ev3 : evalExpr FE EE E_P V_P EE_P [] * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NS' : names_same EE_P SG SS : evalExpr FE EE E_P V_P EE_P [] SS1 : scopes_same EE' EE_P ============================ [] = []
< search. Subgoal 5.3.1: Variables: SF SG PC L FE EE' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' SFC : secFunCtxs SF FE NS : names_same EE' SG Ev : evalArgs FE EE' nilArgs [] EE' [] @ Lev : levelArgs SF SG PC nilArgs L NEq : PC = public -> false ============================ [] = []
< search. Subgoal 5.3.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsA : is_args (consArgs E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Lev : levelArgs SF SG PC (consArgs E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsA. Subgoal 5.3.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 Rest E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ Lev : levelArgs SF SG PC (consArgs E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest ============================ O = []
< Lev: case Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O2 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 O3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalArgs FE EE3 Rest VRest EE' O3 * Ev3 : [] ++ O3 = O H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 ============================ O = []
< case Ev3. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalArgs FE EE3 Rest VRest EE' O * H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalArgs FE EE3 Rest VRest EE' O * H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 H3 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' O EE3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalArgs FE EE3 Rest VRest EE' O * H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_A to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.3.2: Variables: SF SG PC FE EE EE' EE3 VRest V1 Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE (consArgs E Rest) (V1::VRest) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalArgs FE EE3 Rest VRest EE' [] * H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 H3 : names_same EE3 SG H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.3.3: Variables: SF SG PC L FE EE V EE' O IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsA : is_args <unknown K evalArgs> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalArgs FE EE <unknown K evalArgs> V EE' O @ Lev : levelArgs SF SG PC <unknown K evalArgs> L NEq : PC = public -> false ============================ O = []
< case Lev. Subgoal 5.4.1: Variables: SF SG PC L FE EE' IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' SFC : secFunCtxs SF FE NS : names_same EE' SG Ev : evalRecFields FE EE' nilRecFieldExprs [] EE' [] @ Lev : levelRecFields SF SG PC nilRecFieldExprs L NEq : PC = public -> false ============================ [] = []
< search. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O ============================ O = []
< case IsRF. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ O = []
< Lev: case Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O2 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 O2 * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L ============================ O = []
< apply IH_E to _ _ _ _ _ _ _ _ Ev1 Lev _. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 O3 VRest V1 F Rest E LE LRF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalRecFields FE EE3 Rest VRest EE' O3 * Ev3 : [] ++ O3 = O H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L ============================ O = []
< case Ev3. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 VRest V1 F Rest E LE LRF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalRecFields FE EE3 Rest VRest EE' O * H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L ============================ O = []
< apply level_eval_names_same to _ _ _ _ _ _ Ev1 Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 VRest V1 F Rest E LE LRF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalRecFields FE EE3 Rest VRest EE' O * H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L H4 : names_same EE3 SG ============================ O = []
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' O EE3 VRest V1 F Rest E LE LRF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' O @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalRecFields FE EE3 Rest VRest EE' O * H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L H4 : names_same EE3 SG H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O = []
< apply IH_RF to _ _ _ _ _ _ _ _ Ev2 Lev1 _. Subgoal 5.4.2: Variables: SF SG PC L FE EE EE' EE3 VRest V1 F Rest E LE LRF IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE (consRecFieldExprs F E Rest) ((F, V1)::VRest) EE' [] @ NEq : PC = public -> false Ev1 : evalExpr FE EE E V1 EE3 [] * Ev2 : evalRecFields FE EE3 Rest VRest EE' [] * H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L H4 : names_same EE3 SG H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ [] = []
< search. Subgoal 5.4.3: Variables: SF SG PC L FE EE V EE' O IH_S : forall S SF SG PC SG' FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_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) -> secFunCtxs SF FE -> names_same (Scope::EE) SG -> evalStmt FE (Scope::EE) S EE' O * -> secure SF SG PC S SG' -> (PC = public -> false) -> O = [] IH_E : forall E SF SG PC L FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalExpr FE EE E V EE' O * -> level SF SG PC E L -> (PC = public -> false) -> O = [] IH_A : forall A SF SG PC L FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalArgs FE EE A V EE' O * -> levelArgs SF SG PC A L -> (PC = public -> false) -> O = [] IH_RF : forall RF SF SG PC L FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> secFunCtxs SF FE -> names_same EE SG -> evalRecFields FE EE RF V EE' O * -> levelRecFields SF SG PC RF L -> (PC = public -> false) -> O = [] IsRF : is_recFieldExprs <unknown K evalRecFields> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE SFC : secFunCtxs SF FE NS : names_same EE SG Ev : evalRecFields FE EE <unknown K evalRecFields> V EE' O @ Lev : levelRecFields SF SG PC <unknown K evalRecFields> L NEq : PC = public -> false ============================ O = []
< case Lev. Proof completed.
< Extensible_Theorem secure_output : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, IsS : is_stmt S -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> SFC : secFunCtxs SF FE -> NSA : names_same (ScopeA::EE_A) SG -> NSB : names_same (ScopeB::EE_B) SG -> PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> Sec : secure SF SG PC S SG' -> EvA : evalStmt FE (ScopeA::EE_A) S EE_A' OA -> EvB : evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB on EvA as IH_S, expr_secure_output : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsE : is_expr E -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : level SF SG PC E L -> EvA : evalExpr FE EE_A E VA EE_A' OA -> EvB : evalExpr FE EE_B E VB EE_B' OB -> OA = OB on EvA as IH_E, args_secure_output : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsA : is_args A -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : levelArgs SF SG PC A L -> EvA : evalArgs FE EE_A A VA EE_A' OA -> EvB : evalArgs FE EE_B A VB EE_B' OB -> OA = OB on EvA as IH_A, recFields_secure_output : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, IsRF : is_recFieldExprs RF -> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> IsSG : is_list (is_list (is_pair is_string is_slev)) SG -> IsPC : is_slev PC -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A -> IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B -> SFC : secFunCtxs SF FE -> NSA : names_same EE_A SG -> NSB : names_same EE_B SG -> PE : public_equiv SG EE_A EE_B -> Lev : levelRecFields SF SG PC RF L -> EvA : evalRecFields FE EE_A RF VA EE_A' OA -> EvB : evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB on EvA as IH_RF. Subgoal 1: Variables: S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB IsS : is_stmt S IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC S SG' EvA : evalStmt FE (ScopeA::EE_A) S EE_A' OA EvB : evalStmt FE (ScopeB::EE_B) S EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) /\ is_stmt S)
< search. Subgoal 2: Variables: E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsE : is_expr E IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC E L EvA : evalExpr FE EE_A E VA EE_A' OA EvB : evalExpr FE EE_B E VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_expr E)
< search. Subgoal 3: Variables: A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsA : is_args A IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC A L EvA : evalArgs FE EE_A A VA EE_A' OA EvB : evalArgs FE EE_B A VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_args A)
< search. Subgoal 4: Variables: RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IsRF : is_recFieldExprs RF IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC RF L EvA : evalRecFields FE EE_A RF VA EE_A' OA EvB : evalRecFields FE EE_B RF VB EE_B' OB ============================ is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE /\ (is_list (is_list (is_pair is_string is_value)) EE_A /\ is_recFieldExprs RF)
< search. Subgoal 5.1.1: Variables: SF SG PC SG' FE ScopeA EE_A ScopeB EE_B EE_B' OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC noop SG' EvA : evalStmt FE (ScopeA::EE_A) noop (ScopeA::EE_A) [] @ EvB : evalStmt FE (ScopeB::EE_B) noop EE_B' OB ============================ [] = OB
< case EvB. Subgoal 5.1.1: Variables: SF SG PC SG' FE ScopeA EE_A ScopeB EE_B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt noop IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC noop SG' EvA : evalStmt FE (ScopeA::EE_A) noop (ScopeA::EE_A) [] @ ============================ [] = []
< search. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (seq S1 S2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (seq S1 S2) SG' EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (seq S1 S2) EE_B' OB EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (seq S1 S2) SG' EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (seq S1 S2) EE_B' OB EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (seq S1 S2) EE_B' OB EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O1 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply stmt_secure to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG3 EE1 EE2 ============================ OA = OB
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply secure_is to _ _ _ Sec. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_slev)) SG3 ============================ OA = OB
< NSA': apply secure_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_slev)) SG3 NSA' : names_same EE1 SG3 ============================ OA = OB
< NSB': apply secure_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 5.1.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF SG PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_slev)) SG3 NSA' : names_same EE1 SG3 NSB' : names_same EE2 SG3 ============================ OA = OB
< case NSA. Subgoal 5.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 SG3 EE2 O3 O4 BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 SG3 Sec1 : secure SF SG3 PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv SG3 EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_slev)) SG3 NSA' : names_same EE1 SG3 NSB' : names_same EE2 SG3 H7 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H9 : names_same EE_A BRest ============================ OA = OB
< apply secure_older_scopes to _ _ _ Sec. Subgoal 5.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O2 S2 S1 EE2 O3 O4 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 EE1 O3 * EvA2 : evalStmt FE EE1 S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv (Scope'::BRest) EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same EE1 (Scope'::BRest) NSB' : names_same EE2 (Scope'::BRest) H7 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H9 : names_same EE_A BRest H10 : forall X L, lookup B X L -> lookup Scope' X L ============================ OA = OB
< case NSA' (keep). Subgoal 5.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O2 S2 S1 EE2 O3 O4 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O3 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 EE2 O3 EvB1 : evalStmt FE EE2 S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv (Scope'::BRest) (A::ARest) EE2 H4 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same EE2 (Scope'::BRest) H7 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H9 : names_same EE_A BRest H10 : forall X L, lookup B X L -> lookup Scope' X L H11 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H12 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H13 : names_same ARest BRest ============================ OA = OB
< case NSB' (keep). Subgoal 5.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O2 S2 S1 O3 O4 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O3 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 (A1::ARest1) O3 EvB1 : evalStmt FE (A1::ARest1) S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv (Scope'::BRest) (A::ARest) (A1::ARest1) H4 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H5 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H6 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same (A1::ARest1) (Scope'::BRest) H7 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H9 : names_same EE_A BRest H10 : forall X L, lookup B X L -> lookup Scope' X L H11 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H12 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H13 : names_same ARest BRest H14 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) Scope' H15 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A1 H16 : names_same ARest1 BRest ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA2 EvB1. Subgoal 5.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S2 S1 O3 O4 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OA @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O3 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 (A1::ARest1) O3 EvB1 : evalStmt FE (A1::ARest1) S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv (Scope'::BRest) (A::ARest) (A1::ARest1) H4 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H5 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H6 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same (A1::ARest1) (Scope'::BRest) H7 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H9 : names_same EE_A BRest H10 : forall X L, lookup B X L -> lookup Scope' X L H11 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H12 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H13 : names_same ARest BRest H14 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) Scope' H15 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A1 H16 : names_same ARest1 BRest ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.1.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB S2 S1 O3 O4 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (seq S1 S2) EE_A' OB @ EvA1 : evalStmt FE (ScopeA::EE_A) S1 (A::ARest) O3 * EvA2 : evalStmt FE (A::ARest) S2 EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_stmt S1 H2 : is_stmt S2 Sec : secure SF (B::BRest) PC S1 (Scope'::BRest) Sec1 : secure SF (Scope'::BRest) PC S2 SG' EvB : evalStmt FE (ScopeB::EE_B) S1 (A1::ARest1) O3 EvB1 : evalStmt FE (A1::ARest1) S2 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : public_equiv (Scope'::BRest) (A::ARest) (A1::ARest1) H4 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H5 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) H6 : is_list (is_list (is_pair is_string is_slev)) (Scope'::BRest) NSA' : names_same (A::ARest) (Scope'::BRest) NSB' : names_same (A1::ARest1) (Scope'::BRest) H7 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H8 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H9 : names_same EE_A BRest H10 : forall X L, lookup B X L -> lookup Scope' X L H11 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) Scope' H12 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A H13 : names_same ARest BRest H14 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) Scope' H15 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) A1 H16 : names_same ARest1 BRest ============================ OB = OB
< search. Subgoal 5.1.3: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (declare Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (declare Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * ============================ OA = OB
< case IsS. Subgoal 5.1.3: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (declare Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.3: Variables: SF FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty SG1 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (declare Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.3: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.3: Variables: SF FE ScopeA EE_A ScopeB EE_B OB EE1 Scope V X E Ty SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (declare Ty X E) (((X, V)::Scope)::EE1) OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OB * H1 : is_typ Ty H2 : is_string X H3 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB ============================ OB = OB
< search. Subgoal 5.1.4: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (assign X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (assign X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (assign X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' ============================ OA = OB
< case IsS. Subgoal 5.1.4: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (assign X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (assign X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (assign X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X L V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.4.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB V EE1 E X L V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OB * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes X SG' private EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ OB = OB
< search. Subgoal 5.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (assign X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.4.2: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB V EE1 E X V1 EE2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (assign X E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OB * EvA2 : replaceScopes X V EE1 EE_A' H1 : is_string X H2 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes X SG' public EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : replaceScopes X V1 EE2 EE_B' ============================ OB = OB
< search. Subgoal 5.1.5: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (recUpdate Rec Fields E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (recUpdate Rec Fields E) SG' EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' ============================ OA = OB
< case IsS. Subgoal 5.1.5: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (recUpdate Rec Fields E) SG' EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec L V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.5.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec L V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OB * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' PC E L Sec1 : lookupScopes Rec SG' private EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ OB = OB
< search. Subgoal 5.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (recUpdate Rec Fields E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OA * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.5.2: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB V EE1 FieldVals NewVals E Fields Rec V1 EE2 FieldVals1 NewVals1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (recUpdate Rec Fields E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E V EE1 OB * EvA2 : lookupScopes Rec (ScopeA::EE_A) (recVal FieldVals) EvA3 : updateRecFields Fields V FieldVals NewVals EvA4 : replaceScopes Rec (recVal NewVals) EE1 EE_A' H1 : is_string Rec H2 : is_list is_string Fields H3 : is_expr E Sec : level SF SG' public E public Sec1 : lookupScopes Rec SG' public EvB : evalExpr FE (ScopeB::EE_B) E V1 EE2 OB EvB1 : lookupScopes Rec (ScopeB::EE_B) (recVal FieldVals1) EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1 EvB3 : replaceScopes Rec (recVal NewVals1) EE2 EE_B' ============================ OB = OB
< search. Subgoal 5.1.6: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 5.1.6: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.6: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< NSA': apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' ============================ OA = OB
< NSB': apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' ============================ OA = OB
< apply names_same_add_scope to NSA'. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply names_same_add_scope to NSB'. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') ============================ OA = OB
< PE': apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 ============================ OA = OB
< apply public_equiv_add_scope to PE'. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) ============================ OA = OB
< apply level_is to _ _ _ Sec. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L ============================ OA = OB
< apply join_is to _ _ Sec1. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L H10 : is_slev Sl1 ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L H10 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.1.6.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L H10 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply level_is to _ _ _ Sec. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L ============================ OA = OB
< apply join_is to _ _ Sec1. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 ============================ OA = OB
< assert Sl1 = public -> false. Subgoal 5.1.6.2.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.1.6.2.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.1.6.2.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev public ============================ false
< apply join_public to _ _ Sec1. Subgoal 5.1.6.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' public Cond public Sec1 : join public public public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev public H5 : is_slev public ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< NSA': apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' ============================ OA = OB
< apply names_same_add_scope to NSA'. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvA2 Sec2 _. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') [] * EvA3 : O3 ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply append_nil_right to EvA3. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 OA EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 OA EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< NSB': apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 OA EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' ============================ OA = OB
< apply names_same_add_scope to NSB'. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 OA EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' H10 : names_same ([]::EE2) ([]::SG') ============================ OA = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvB1 Sec3 _. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 OA EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') [] EvB2 : OA ++ [] = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' H10 : names_same ([]::EE2) ([]::SG') ============================ OA = OB
< apply append_nil_right to EvB2. Subgoal 5.1.6.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 OB * EvA2 : evalStmt FE ([]::EE1) Th (Scope::EE_A') [] * EvA3 : OB ++ [] = OB H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 OB EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') [] EvB2 : OB ++ [] = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' H10 : names_same ([]::EE2) ([]::SG') ============================ OB = OB
< search. Subgoal 5.1.7: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (ifThenElse Cond Th El) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 5.1.7: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (ifThenElse Cond Th El) SG' EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.7: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (ifThenElse Cond Th El) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply level_is to _ _ _ Sec. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L ============================ OA = OB
< apply join_is to _ _ Sec1. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 ============================ OA = OB
< assert Sl1 = public -> false. Subgoal 5.1.7.1.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.1.7.1.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.1.7.1.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev public ============================ false
< apply join_public to _ _ Sec1. Subgoal 5.1.7.1.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' public Cond public Sec1 : join public public public Sec2 : secure SF ([]::SG') public Th SGT Sec3 : secure SF ([]::SG') public El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev public H5 : is_slev public ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< NSA': apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' ============================ OA = OB
< apply names_same_add_scope to NSA'. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvA2 Sec3 _. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') [] * EvA3 : O3 ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply append_nil_right to EvA3. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 OA EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 OA EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< NSB': apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 OA EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' ============================ OA = OB
< apply names_same_add_scope to NSB'. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 OA EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') O4 EvB2 : OA ++ O4 = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' H10 : names_same ([]::EE2) ([]::SG') ============================ OA = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvB1 Sec2 _. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 OA * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') [] * EvA3 : OA ++ [] = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 OA EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') [] EvB2 : OA ++ [] = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' H10 : names_same ([]::EE2) ([]::SG') ============================ OA = OB
< apply append_nil_right to EvB2. Subgoal 5.1.7.1: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 OB * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') [] * EvA3 : OB ++ [] = OB H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE2 OB EvB1 : evalStmt FE ([]::EE2) Th (Scope1::EE_B') [] EvB2 : OB ++ [] = OB H4 : is_slev L H5 : is_slev Sl1 H6 : Sl1 = public -> false H7 : is_list (is_list (is_pair is_string is_value)) EE1 NSA' : names_same EE1 SG' H8 : names_same ([]::EE1) ([]::SG') H9 : is_list (is_list (is_pair is_string is_value)) EE2 NSB' : names_same EE2 SG' H10 : names_same ([]::EE2) ([]::SG') ============================ OB = OB
< search. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< NSA': apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' ============================ OA = OB
< NSB': apply level_eval_names_same to _ _ _ _ _ _ EvB Sec. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' ============================ OA = OB
< apply names_same_add_scope to NSA'. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply names_same_add_scope to NSB'. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') ============================ OA = OB
< PE': apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 ============================ OA = OB
< apply public_equiv_add_scope to PE'. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) ============================ OA = OB
< apply level_is to _ _ _ Sec. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L ============================ OA = OB
< apply join_is to _ _ Sec1. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O2 El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L H10 : is_slev Sl1 ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec3 EvA2 EvB1. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L H10 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.1.7.2: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB EE1 Scope El Th Cond L Sl1 SGT SGF EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (ifThenElse Cond Th El) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE1 O3 * EvA2 : evalStmt FE ([]::EE1) El (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr Cond H2 : is_stmt Th H3 : is_stmt El Sec : level SF SG' PC Cond L Sec1 : join L PC Sl1 Sec2 : secure SF ([]::SG') Sl1 Th SGT Sec3 : secure SF ([]::SG') Sl1 El SGF EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE2 O3 EvB1 : evalStmt FE ([]::EE2) El (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 NSA' : names_same EE1 SG' NSB' : names_same EE2 SG' H6 : names_same ([]::EE1) ([]::SG') H7 : names_same ([]::EE2) ([]::SG') PE' : public_equiv SG' EE1 EE2 H8 : public_equiv ([]::SG') ([]::EE1) ([]::EE2) H9 : is_slev L H10 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.1.8: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA ============================ OA = OB
< case IsS. Subgoal 5.1.8: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body ============================ OA = OB
< Sec: case Sec (keep). Subgoal 5.1.8.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ OA = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvA Sec _. Subgoal 5.1.8.1: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' [] @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = [] H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ [] = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvB Sec _. Subgoal 5.1.8.1: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' EE1 O1 Scope EE2 O2 O3 O12 Body Cond L Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' [] @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' [] EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = [] H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope1::SG2) ============================ [] = []
< search. Subgoal 5.1.8.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ OA = OB
< NSA': apply level_eval_names_same to _ _ _ _ _ _ EvA1 Sec1. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' ============================ OA = OB
< NSB': apply level_eval_names_same to _ _ _ _ _ _ EvB Sec1. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' ============================ OA = OB
< apply names_same_add_scope to NSA'. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') ============================ OA = OB
< apply names_same_add_scope to NSB'. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') ============================ OA = OB
< PE': apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 ============================ OA = OB
< apply public_equiv_add_scope to PE'. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) ============================ OA = OB
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvA2. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ OA = OB
< case IsEE2+. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< IsEE4+: apply evalStmt_isCtx to _ _ _ EvB1. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope2::EE4) ============================ OA = OB
< case IsEE4+. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OA = OB
< NSA'': apply secure_eval_names_same to _ _ _ _ _ _ EvA2 Sec2. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA'' : names_same (Scope::EE2) (Scope1::SG2) ============================ OA = OB
< NSB'': apply secure_eval_names_same to _ _ _ _ _ _ EvB1 Sec2. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA'' : names_same (Scope::EE2) (Scope1::SG2) NSB'' : names_same (Scope2::EE4) (Scope1::SG2) ============================ OA = OB
< PE'': apply stmt_secure to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA2 EvB1. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA'' : names_same (Scope::EE2) (Scope1::SG2) NSB'' : names_same (Scope2::EE4) (Scope1::SG2) PE'' : public_equiv (Scope1::SG2) (Scope::EE2) (Scope2::EE4) ============================ OA = OB
< NSA-: case NSA''. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSB'' : names_same (Scope2::EE4) (Scope1::SG2) PE'' : public_equiv (Scope1::SG2) (Scope::EE2) (Scope2::EE4) NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 NSA-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope NSA-2 : names_same EE2 SG2 ============================ OA = OB
< NSB-: case NSB''. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 PE'' : public_equiv (Scope1::SG2) (Scope::EE2) (Scope2::EE4) NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 NSA-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope NSA-2 : names_same EE2 SG2 NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope1 NSB-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same EE4 SG2 ============================ OA = OB
< PE-: case PE''. Subgoal 5.1.8.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 SG' NSB' : names_same EE3 SG' H5 : names_same ([]::EE1) ([]::SG') H6 : names_same ([]::EE3) ([]::SG') PE' : public_equiv SG' EE1 EE3 H7 : public_equiv ([]::SG') ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 NSA-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope NSA-2 : names_same EE2 SG2 NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope1 NSB-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same EE4 SG2 PE- : forall X V, lookup Scope1 X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope1 X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv SG2 EE2 EE4 ============================ OA = OB
< case NSA. Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 NSA-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope NSA-2 : names_same EE2 SG2 NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope1 NSB-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same EE4 SG2 PE- : forall X V, lookup Scope1 X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope1 X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv SG2 EE2 EE4 H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest ============================ OA = OB
< case NSB. Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond Scope1 SG2 EE3 O4 Scope2 EE4 O5 O6 O7 BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope1 NSA-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope NSA-2 : names_same EE2 SG2 NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope1 NSB-1 : forall X IB, mem (X, IB) Scope1 -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same EE4 SG2 PE- : forall X V, lookup Scope1 X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope1 X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv SG2 EE2 EE4 H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest H15 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H16 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H17 : names_same EE_B BRest ============================ OA = OB
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope EE2 O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O5 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) EE2 H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA-2 : names_same EE2 (B::BRest) NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same EE4 (B::BRest) PE- : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv (B::BRest) EE2 EE4 H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest H15 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H16 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H17 : names_same EE_B BRest H18 : forall X L, lookup [] X L -> lookup Scope' X L ============================ OA = OB
< case NSA-2 (keep). Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O3 O12 Body Cond EE3 O4 Scope2 EE4 O5 O6 O7 BRest B Scope' ARest A IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A::ARest)) O5 * EvA3 : evalStmt FE (A::ARest) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::EE4) O5 EvB2 : evalStmt FE EE4 (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) EE4 NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA-2 : names_same (A::ARest) (B::BRest) NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same EE4 (B::BRest) PE- : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv (B::BRest) (A::ARest) EE4 H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest H15 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H16 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H17 : names_same EE_B BRest H18 : forall X L, lookup [] X L -> lookup Scope' X L H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest ============================ OA = OB
< case NSB-2 (keep). Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O3 O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A::ARest)) O5 * EvA3 : evalStmt FE (A::ARest) (while Cond Body) EE_A' O3 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A1::ARest1)) O5 EvB2 : evalStmt FE (A1::ARest1) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA-2 : names_same (A::ARest) (B::BRest) NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same (A1::ARest1) (B::BRest) PE- : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv (B::BRest) (A::ARest) (A1::ARest1) H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest H15 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H16 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H17 : names_same EE_B BRest H18 : forall X L, lookup [] X L -> lookup Scope' X L H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec EvA3 EvB2. Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope O12 Body Cond EE3 O4 Scope2 O5 O6 O7 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A::ARest)) O5 * EvA3 : evalStmt FE (A::ARest) (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O12 EvA5 : O12 ++ O6 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A1::ARest1)) O5 EvB2 : evalStmt FE (A1::ARest1) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA-2 : names_same (A::ARest) (B::BRest) NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same (A1::ARest1) (B::BRest) PE- : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv (B::BRest) (A::ARest) (A1::ARest1) H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest H15 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H16 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H17 : names_same EE_B BRest H18 : forall X L, lookup [] X L -> lookup Scope' X L H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 Scope Body Cond EE3 O4 Scope2 O5 O6 O7 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A::ARest)) O5 * EvA3 : evalStmt FE (A::ARest) (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O7 EvA5 : O7 ++ O6 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A1::ARest1)) O5 EvB2 : evalStmt FE (A1::ARest1) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA-2 : names_same (A::ARest) (B::BRest) NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same (A1::ARest1) (B::BRest) PE- : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv (B::BRest) (A::ARest) (A1::ARest1) H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest H15 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H16 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H17 : names_same EE_B BRest H18 : forall X L, lookup [] X L -> lookup Scope' X L H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest ============================ OA = OB
< apply append_unique to EvA5 EvB4. Subgoal 5.1.8.2.1: Variables: SF FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB EE1 Scope Body Cond EE3 O4 Scope2 O5 O6 O7 BRest B Scope' ARest A ARest1 A1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF (B::BRest) public (while Cond Body) (B::BRest) EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O4 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::(A::ARest)) O5 * EvA3 : evalStmt FE (A::ARest) (while Cond Body) EE_A' O6 * EvA4 : O4 ++ O5 = O7 EvA5 : O7 ++ O6 = OB H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF (B::BRest) public Cond public Sec2 : secure SF ([]::(B::BRest)) public Body (Scope'::(B::BRest)) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE3 O4 EvB1 : evalStmt FE ([]::EE3) Body (Scope2::(A1::ARest1)) O5 EvB2 : evalStmt FE (A1::ARest1) (while Cond Body) EE_B' O6 EvB3 : O4 ++ O5 = O7 EvB4 : O7 ++ O6 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NSA' : names_same EE1 (B::BRest) NSB' : names_same EE3 (B::BRest) H5 : names_same ([]::EE1) ([]::(B::BRest)) H6 : names_same ([]::EE3) ([]::(B::BRest)) PE' : public_equiv (B::BRest) EE1 EE3 H7 : public_equiv ([]::(B::BRest)) ([]::EE1) ([]::EE3) H8 : is_list (is_pair is_string is_value) Scope H9 : is_list (is_list (is_pair is_string is_value)) (A::ARest) H10 : is_list (is_pair is_string is_value) Scope2 H11 : is_list (is_list (is_pair is_string is_value)) (A1::ARest1) NSA- : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope' NSA-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope NSA-2 : names_same (A::ARest) (B::BRest) NSB- : forall X IA, mem (X, IA) Scope2 -> exists IB, mem (X, IB) Scope' NSB-1 : forall X IB, mem (X, IB) Scope' -> exists IA, mem (X, IA) Scope2 NSB-2 : names_same (A1::ARest1) (B::BRest) PE- : forall X V, lookup Scope' X public -> lookup Scope X V -> lookup Scope2 X V PE-1 : forall X V, lookup Scope' X public -> lookup Scope2 X V -> lookup Scope X V PE-2 : public_equiv (B::BRest) (A::ARest) (A1::ARest1) H12 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H13 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H14 : names_same EE_A BRest H15 : forall X IA, mem (X, IA) ScopeB -> exists IB, mem (X, IB) B H16 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeB H17 : names_same EE_B BRest H18 : forall X L, lookup [] X L -> lookup Scope' X L H19 : forall X IA, mem (X, IA) A -> exists IB, mem (X, IB) B H20 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A H21 : names_same ARest BRest H22 : forall X IA, mem (X, IA) A1 -> exists IB, mem (X, IB) B H23 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) A1 H24 : names_same ARest1 BRest ============================ OB = OB
< search. Subgoal 5.1.8.2.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB EE1 O1 Scope EE2 O2 O3 O12 Body Cond Scope1 SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond trueVal EE1 O1 * EvA2 : evalStmt FE ([]::EE1) Body (Scope::EE2) O2 * EvA3 : evalStmt FE EE2 (while Cond Body) EE_A' O3 * EvA4 : O1 ++ O2 = O12 EvA5 : O12 ++ O3 = OA H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope1::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 5.1.9: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (while Cond Body) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * ============================ OA = OB
< case IsS. Subgoal 5.1.9: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body ============================ OA = OB
< Sec: case Sec (keep). Subgoal 5.1.9.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond L Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) ============================ OA = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvA Sec _. Subgoal 5.1.9.1: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Body Cond L Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' [] @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' [] * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) ============================ [] = OB
< apply stmt_not_public_no_output to _ _ _ _ _ _ _ _ EvB Sec _. Subgoal 5.1.9.1: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' Body Cond L Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' private (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' [] @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' [] EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' [] * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' private Cond L Sec2 : secure SF ([]::SG') private Body (Scope::SG2) ============================ [] = []
< search. Subgoal 5.1.9.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (while Cond Body) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.9.2.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 EE1 O1 Scope1 EE2 O2 O3 O12 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond trueVal EE1 O1 EvB1 : evalStmt FE ([]::EE1) Body (Scope1::EE2) O2 EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O3 EvB3 : O1 ++ O2 = O12 EvB4 : O12 ++ O3 = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 5.1.9.2.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Body Cond Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OA * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec1 EvA1 EvB. Subgoal 5.1.9.2.2: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Body Cond Scope SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG' public (while Cond Body) SG' EvA : evalStmt FE (ScopeA::EE_A) (while Cond Body) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) Cond falseVal EE_A' OB * H1 : is_expr Cond H2 : is_stmt Body Sec1 : level SF SG' public Cond public Sec2 : secure SF ([]::SG') public Body (Scope::SG2) EvB : evalExpr FE (ScopeB::EE_B) Cond falseVal EE_B' OB ============================ OB = OB
< search. Subgoal 5.1.10: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (scopeStmt S1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (scopeStmt S1) SG' EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * ============================ OA = OB
< case IsS. Subgoal 5.1.10: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (scopeStmt S1) SG' EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (scopeStmt S1) EE_B' OB EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB ============================ OA = OB
< apply names_same_add_scope to NSA. Subgoal 5.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : names_same ([]::(ScopeA::EE_A)) ([]::SG') ============================ OA = OB
< apply names_same_add_scope to NSB. Subgoal 5.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : names_same ([]::(ScopeA::EE_A)) ([]::SG') H3 : names_same ([]::(ScopeB::EE_B)) ([]::SG') ============================ OA = OB
< apply public_equiv_add_scope to PE. Subgoal 5.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OA @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OA * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : names_same ([]::(ScopeA::EE_A)) ([]::SG') H3 : names_same ([]::(ScopeB::EE_B)) ([]::SG') H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B)) ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.10: Variables: SF PC SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Scope S1 Scope1 Scope2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (scopeStmt S1) EE_A' OB @ EvA1 : evalStmt FE ([]::(ScopeA::EE_A)) S1 (Scope::EE_A') OB * H1 : is_stmt S1 Sec : secure SF ([]::SG') PC S1 (Scope1::SG') EvB : evalStmt FE ([]::(ScopeB::EE_B)) S1 (Scope2::EE_B') OB H2 : names_same ([]::(ScopeA::EE_A)) ([]::SG') H3 : names_same ([]::(ScopeB::EE_B)) ([]::SG') H4 : public_equiv ([]::SG') ([]::(ScopeA::EE_A)) ([]::(ScopeB::EE_B)) ============================ OB = OB
< search. Subgoal 5.1.11: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA ============================ OA = OB
< case IsS. Subgoal 5.1.11: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.11: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.11.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E I1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.11.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I E I1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O2 * EvA2 : O2 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.11.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB E I1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I1) EE_A' O2 * EvA2 : O2 ++ [intVal I1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 5.1.11.1: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E I1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I1) EE_A' O2 * EvA2 : O2 ++ [intVal I1] = OB H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I1) EE_B' O2 EvB1 : O2 ++ [intVal I1] = OB ============================ OB = OB
< search. Subgoal 5.1.11.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.11.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.11.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB I O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (intVal I) EE_A' O1 * EvA2 : O1 ++ [intVal I] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.12: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA ============================ OA = OB
< case IsS. Subgoal 5.1.12: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.12: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.12.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.12.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.12.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.12.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 5.1.12.2: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O2 * EvA2 : O2 ++ [trueVal] = OB H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OB = OB
< search. Subgoal 5.1.12.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.12.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E trueVal EE_A' O1 * EvA2 : O1 ++ [trueVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.13: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA ============================ OA = OB
< case IsS. Subgoal 5.1.13: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.13: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.13.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.13.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.13.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.13.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.13.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 5.1.13.3: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O2 * EvA2 : O2 ++ [falseVal] = OB H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OB = OB
< search. Subgoal 5.1.13.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB O1 E S1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E falseVal EE_A' O1 * EvA2 : O1 ++ [falseVal] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S1) EE_B' O2 EvB1 : O2 ++ [stringVal S1] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.14: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (printVal E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA ============================ OA = OB
< case IsS. Subgoal 5.1.14: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (printVal E) SG' EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.14: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) (printVal E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.14.1: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E I O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (intVal I) EE_B' O2 EvB1 : O2 ++ [intVal I] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.14.2: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E trueVal EE_B' O2 EvB1 : O2 ++ [trueVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.14.3: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E falseVal EE_B' O2 EvB1 : O2 ++ [falseVal] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.14.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 O1 E S2 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O1 * EvA2 : O1 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.14.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB S1 E S2 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S1) EE_A' O2 * EvA2 : O2 ++ [stringVal S1] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ OA = OB
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.14.4: Variables: SF SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB E S2 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S2) EE_A' O2 * EvA2 : O2 ++ [stringVal S2] = OA H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ OA = OB
< apply append_unique to EvA2 EvB1. Subgoal 5.1.14.4: Variables: SF SG' FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB E S2 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG' IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG' NSB : names_same (ScopeB::EE_B) SG' PE : public_equiv SG' (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (printVal E) EE_A' OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E (stringVal S2) EE_A' O2 * EvA2 : O2 ++ [stringVal S2] = OB H1 : is_expr E Sec : level SF SG' public E public EvB : evalExpr FE (ScopeB::EE_B) E (stringVal S2) EE_B' O2 EvB1 : O2 ++ [stringVal S2] = OB ============================ OB = OB
< search. Subgoal 5.1.15: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt (secdecl L Ty X E) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (secdecl L Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * ============================ OA = OB
< case IsS. Subgoal 5.1.15: Variables: SF SG PC SG' FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty L IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC (secdecl L Ty X E) SG' EvA : evalStmt FE (ScopeA::EE_A) (secdecl L Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (secdecl L Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev L H2 : is_typ Ty H3 : is_string X H4 : is_expr E ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.15.1: Variables: SF PC FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty L1 SG1 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (secdecl private Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope1::SG1) PC E L1 Sec1 : no_lookup Scope1 X ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.15.1: Variables: SF PC FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty L1 SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope1::SG1) PC E L1 Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.15.1: Variables: SF PC FE ScopeA EE_A ScopeB EE_B OB EE1 Scope V X E Ty L1 SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl private Ty X E) (((X, V)::Scope)::EE1) OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OB * H1 : is_slev private H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope1::SG1) PC E L1 Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB ============================ OB = OB
< search. Subgoal 5.1.15.2: Variables: SF FE ScopeA EE_A OA ScopeB EE_B EE_B' OB EE1 Scope V X E Ty SG1 Scope1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::Scope)::EE1) OA @ EvB : evalStmt FE (ScopeB::EE_B) (secdecl public Ty X E) EE_B' OB EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X ============================ OA = OB
< EvB: case EvB. Subgoal 5.1.15.2: Variables: SF FE ScopeA EE_A OA ScopeB EE_B OB EE1 Scope V X E Ty SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::Scope)::EE1) OA @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OA * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Sec EvA1 EvB. Subgoal 5.1.15.2: Variables: SF FE ScopeA EE_A ScopeB EE_B OB EE1 Scope V X E Ty SG1 Scope1 EE2 Scope2 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (Scope1::SG1) IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (Scope1::SG1) NSB : names_same (ScopeB::EE_B) (Scope1::SG1) PE : public_equiv (Scope1::SG1) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) (secdecl public Ty X E) (((X, V)::Scope)::EE1) OB @ EvA1 : evalExpr FE (ScopeA::EE_A) E V (Scope::EE1) OB * H1 : is_slev public H2 : is_typ Ty H3 : is_string X H4 : is_expr E Sec : level SF (Scope1::SG1) public E public Sec1 : no_lookup Scope1 X EvB : evalExpr FE (ScopeB::EE_B) E V1 (Scope2::EE2) OB ============================ OB = OB
< search. Subgoal 5.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) Sec : secure SF SG PC <unknown K evalStmt> SG' EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * ============================ OA = OB
< Sec: case Sec. Subgoal 5.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' ============================ OA = OB
< apply names_is to _ EvA1. Subgoal 5.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names ============================ OA = OB
< apply names_is_sec to _ Sec. Subgoal 5.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ OA = OB
< apply proj_stmt_unique to Sec1 EvA2 _ _ _ _ _. Subgoal 5.1.16.1: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.1.16.1: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NSA EvA1 Sec M. Subgoal 5.1.16.1: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.1.16.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.1.16.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NSA EvA1 Sec M. Subgoal 5.1.16.2: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 S_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P1 Sec2 : secure SF SG PC S_P1 SG' H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ OA = OB
< apply proj_stmt_is to Sec1 _ _. Subgoal 5.1.16: Variables: SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) SG NSB : names_same (ScopeB::EE_B) SG PE : public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names SG Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF SG PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P ============================ OA = OB
< case NSA (keep). Subgoal 5.1.16: Variables: SF PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P SG' H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest ============================ OA = OB
< apply secure_older_scopes to _ _ _ Sec2. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L ============================ OA = OB
< NSB-: apply names_same_symmetric to NSB. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) ============================ OA = OB
< NSAB: apply names_same_transitive to NSA NSB-. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) ============================ OA = OB
< NamesB: apply names_exists to IsEE_B. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N ============================ OA = OB
< apply names_is to _ EvA1. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names ============================ OA = OB
< apply names_is to _ NamesB. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N ============================ OA = OB
< PrB: apply proj_stmt_other to EvA2 _ _ _ with L' = N. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ OA = OB
< apply proj_stmt_unique to EvA2 PrB _ _ _ _ _. Subgoal 5.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ forall X, mem X N -> mem X Names
< intros M. Subgoal 5.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X N ============================ mem X Names
< NSBA: apply names_same_symmetric to NSAB. Subgoal 5.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X N NSBA : names_same (ScopeB::EE_B) (ScopeA::EE_A) ============================ mem X Names
< apply names_same_names to NSBA NamesB EvA1 M. Subgoal 5.1.16.3: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X N NSBA : names_same (ScopeB::EE_B) (ScopeA::EE_A) H10 : mem X Names ============================ mem X Names
< search. Subgoal 5.1.16.4: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ forall X, mem X Names -> mem X N
< intros M. Subgoal 5.1.16.4: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X Names ============================ mem X N
< apply names_same_names to NSAB EvA1 NamesB M. Subgoal 5.1.16.4: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names S_P EE_P O_P Names1 BRest B Scope' N S'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S_P EvA3 : evalStmt FE (ScopeA::EE_A) S_P EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S_P Sec2 : secure SF (B::BRest) PC S_P (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S_P H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' M : mem X Names H10 : mem X N ============================ mem X N
< search. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' ============================ OA = OB
< EvB': apply proj_evalStmt_forward to PrB NamesB _ _ _ EvB. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' ============================ OA = OB
< EvA': apply proj_evalStmt_forward to EvA2 EvA1 _ _ _ EvA. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' EE''1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OA @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE''1 OA EvA'1 : scopes_same EE_A' EE''1 ============================ OA = OB
< apply evalStmt_unique to _ _ _ EvA' EvA3. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' O_P @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P EvA'1 : scopes_same EE_A' EE_P ============================ O_P = OB
< apply proj_stmt_is to PrB _ _. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P O_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' O_P @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P O_P EvA'1 : scopes_same EE_A' EE_P H10 : is_stmt S'' ============================ O_P = OB
< PE_Pr: apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Sec2 EvA3 EvB'. Subgoal 5.1.16: Variables: SF PC FE ScopeA EE_A EE_A' ScopeB EE_B EE_B' OB Names EE_P Names1 BRest B Scope' N S'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsS : is_stmt <unknown K evalStmt> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) (B::BRest) IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) IsEE_B : is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) SFC : secFunCtxs SF FE NSA : names_same (ScopeA::EE_A) (B::BRest) NSB : names_same (ScopeB::EE_B) (B::BRest) PE : public_equiv (B::BRest) (ScopeA::EE_A) (ScopeB::EE_B) EvA : evalStmt FE (ScopeA::EE_A) <unknown K evalStmt> EE_A' OB @ EvB : evalStmt FE (ScopeB::EE_B) <unknown K evalStmt> EE_B' OB EvA1 : names (ScopeA::EE_A) Names EvA2 : Names |{stmt}- <unknown K evalStmt> ~~> S'' EvA3 : evalStmt FE (ScopeA::EE_A) S'' EE_P OB * Sec : names (B::BRest) Names1 Sec1 : Names1 |{stmt}- <unknown K evalStmt> ~~> S'' Sec2 : secure SF (B::BRest) PC S'' (Scope'::BRest) H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_stmt S'' H4 : forall X IA, mem (X, IA) ScopeA -> exists IB, mem (X, IB) B H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) ScopeA H6 : names_same EE_A BRest H7 : forall X L, lookup B X L -> lookup Scope' X L NSB- : names_same (B::BRest) (ScopeB::EE_B) NSAB : names_same (ScopeA::EE_A) (ScopeB::EE_B) NamesB : names (ScopeB::EE_B) N H8 : is_list is_string Names H9 : is_list is_string N PrB : N |{stmt}- <unknown K evalStmt> ~~> S'' EvB' : evalStmt FE (ScopeB::EE_B) S'' EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalStmt FE (ScopeA::EE_A) S'' EE_P OB EvA'1 : scopes_same EE_A' EE_P H10 : is_stmt S'' ============================ OB = OB
< search. Subgoal 5.2.1: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB I IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (num I) L EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ EvB : evalExpr FE EE_B (num I) VB EE_B' OB ============================ [] = OB
< case EvB. Subgoal 5.2.1: Variables: SF SG PC L FE EE_A' EE_B' I IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (num I) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (num I) L EvA : evalExpr FE EE_A' (num I) (intVal I) EE_A' [] @ ============================ [] = []
< search. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (plus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (plus E1 E2) L EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (plus E1 E2) L EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (plus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (plus E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 + I2 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 + I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (minus E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (minus E1 E2) L EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (minus E1 E2) L EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (minus E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (minus E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 - I2 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 - I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (mult E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (mult E1 E2) L EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (mult E1 E2) L EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (mult E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.4: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (mult E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 * I2 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 * I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (div E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (div E1 E2) L EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (div E1 E2) L EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (div E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.5: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 I E2 E1 L2 L3 I4 EE2 O3 I5 O4 I3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (div E1 E2) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 / I2 = I EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I5) EE_B' O4 EvB2 : I4 / I5 = I3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.6: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC true L EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ EvB : evalExpr FE EE_B true VB EE_B' OB ============================ [] = OB
< case EvB. Subgoal 5.2.6: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr true IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC true L EvA : evalExpr FE EE_A' true trueVal EE_A' [] @ ============================ [] = []
< search. Subgoal 5.2.7: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC false L EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ EvB : evalExpr FE EE_B false VB EE_B' OB ============================ [] = OB
< case EvB. Subgoal 5.2.7: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr false IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC false L EvA : evalExpr FE EE_A' false falseVal EE_A' [] @ ============================ [] = []
< search. Subgoal 5.2.8: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.8: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.8: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.8.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OA = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.8.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.8.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 5.2.8.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ OA = OB
< assert Sl1 = public -> false. Subgoal 5.2.8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.8.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.8.2.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' [] * EvA3 : OB ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply append_nil_right to EvA3. Subgoal 5.2.8.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OA * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' [] * EvA3 : OA ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OA NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OA
< search. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.8.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.9: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ OA = OB
< case IsE. Subgoal 5.2.9: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.9: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ O1 = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.9.1.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.9.1.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 5.2.9.1.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ O1 = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 ============================ O1 = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ O1 = OB
< assert Sl1 = public -> false. Subgoal 5.2.9.1.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.9.1.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.9.1.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.9.1.2: Variables: SF SG L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ O1 = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ O1 = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' [] EvB2 : O1 ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply append_nil_right to EvB2. Subgoal 5.2.9.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 OB EvB1 : evalExpr FE EE1 E2 trueVal EE_B' [] EvB2 : OB ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OB = OB
< search. Subgoal 5.2.9.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.9.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OB = OB
< search. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ O1 = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.9.3.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.9.3.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 5.2.9.3.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ O1 = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 ============================ O1 = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ O1 = OB
< assert Sl1 = public -> false. Subgoal 5.2.9.3.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.9.3.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.9.3.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.9.3.2: Variables: SF SG L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ O1 = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ O1 = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' [] EvB2 : O1 ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply append_nil_right to EvB2. Subgoal 5.2.9.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE1 OB EvB1 : evalExpr FE EE1 E2 falseVal EE_B' [] EvB2 : OB ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OB = OB
< search. Subgoal 5.2.10: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (and E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.10: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (and E1 E2) L EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.10: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (and E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.10.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OA = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.10.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.10.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 5.2.10.2.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ OA = OB
< assert Sl1 = public -> false. Subgoal 5.2.10.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.10.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.10.2.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.10.2.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' [] * EvA3 : OB ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply append_nil_right to EvA3. Subgoal 5.2.10.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 OA * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' [] * EvA3 : OA ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OA NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OA
< search. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.10.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (and E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.11: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ OA = OB
< case IsE. Subgoal 5.2.11: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.11: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.11.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.11.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OB = OB
< search. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ O1 = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.11.2.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.11.2.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 5.2.11.2.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ O1 = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 ============================ O1 = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ O1 = OB
< assert Sl1 = public -> false. Subgoal 5.2.11.2.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.11.2.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.11.2.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.11.2.2: Variables: SF SG L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ O1 = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ O1 = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 trueVal EE_B' [] EvB2 : O1 ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply append_nil_right to EvB2. Subgoal 5.2.11.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 OB EvB1 : evalExpr FE EE1 E2 trueVal EE_B' [] EvB2 : OB ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OB = OB
< search. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ O1 = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.11.3.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.11.3.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB E : L2 = public ============================ false
< case E. Subgoal 5.2.11.3.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false ============================ O1 = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 ============================ O1 = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ O1 = OB
< assert Sl1 = public -> false. Subgoal 5.2.11.3.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.11.3.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.11.3.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.11.3.2: Variables: SF SG L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ O1 = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ O1 = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 O2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' O2 EvB2 : O1 ++ O2 = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvB1 Lev2 _. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 O1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' O1 @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' O1 * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 O1 EvB1 : evalExpr FE EE1 E2 falseVal EE_B' [] EvB2 : O1 ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O1 = OB
< apply append_nil_right to EvB2. Subgoal 5.2.11.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E2 E1 L2 Sl1 L3 EE1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OB * H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE1 OB EvB1 : evalExpr FE EE1 E2 falseVal EE_B' [] EvB2 : OB ++ [] = OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OB = OB
< search. Subgoal 5.2.12: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.12: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.12: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OA = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.12.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.12.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 5.2.12.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ OA = OB
< assert Sl1 = public -> false. Subgoal 5.2.12.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.12.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.12.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.12.1.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' [] * EvA3 : OB ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply append_nil_right to EvA3. Subgoal 5.2.12.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OA * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' [] * EvA3 : OA ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OA NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OA
< search. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.12.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.12.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 trueVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.13: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (or E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.13: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (or E1 E2) L EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.13: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (or E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OA = OB
< NEq: assert L2 = public -> false. Subgoal 5.2.13.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ L2 = public -> false
< intros E. Subgoal 5.2.13.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB E : L2 = public ============================ false
< case E. Subgoal 5.2.13.1.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 public Lev1 : join public PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ false
< apply expr_level to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ OA = OB
< assert Sl1 = public -> false. Subgoal 5.2.13.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.13.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 E : Sl1 = public ============================ false
< case E. Subgoal 5.2.13.1.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC public Lev2 : level SF SG public E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev public ============================ false
< apply join_public to _ _ Lev1. Subgoal 5.2.13.1.2: Variables: SF SG L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG public E1 public Lev1 : join public public public Lev2 : level SF SG public E2 L3 Lev3 : join public L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : public = public -> false H3 : is_slev public H4 : is_slev public ============================ false
< backchain NEq. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : OB ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply expr_not_public_no_output to _ _ _ _ _ _ _ _ EvA2 Lev2 _. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OB * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' [] * EvA3 : OB ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply append_nil_right to EvA3. Subgoal 5.2.13.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' EE1 E2 E1 L2 Sl1 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 OA * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' [] * EvA3 : OA ++ [] = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OA NEq : L2 = public -> false H3 : is_slev L2 H4 : is_slev Sl1 H5 : Sl1 = public -> false H6 : names_same EE1 SG H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OA
< search. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.13.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 trueVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O1 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply level_is to _ _ _ Lev. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 ============================ OA = OB
< apply join_is to _ _ Lev1. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA2 EvB1. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.13.3: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 L2 Sl1 L3 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (or E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE1 O3 * EvA2 : evalExpr FE EE1 E2 falseVal EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : join L2 PC Sl1 Lev2 : level SF SG Sl1 E2 L3 Lev3 : join L2 L3 L EvB : evalExpr FE EE_B E1 falseVal EE2 O3 EvB1 : evalExpr FE EE2 E2 falseVal EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 H8 : is_slev L2 H9 : is_slev Sl1 ============================ OB = OB
< search. Subgoal 5.2.14: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * ============================ OA = OB
< case IsE. Subgoal 5.2.14: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.14: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.14.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.14.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OB * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OB = OB
< search. Subgoal 5.2.14.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.14.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 falseVal EE_A' OB * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OB = OB
< search. Subgoal 5.2.15: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (not E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * ============================ OA = OB
< case IsE. Subgoal 5.2.15: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (not E1) L EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.15: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (not E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.15.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.15.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OB * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 falseVal EE_B' OB ============================ OB = OB
< search. Subgoal 5.2.15.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OA * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.15.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (not E1) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 trueVal EE_A' OB * H1 : is_expr E1 Lev : level SF SG PC E1 L EvB : evalExpr FE EE_B E1 trueVal EE_B' OB ============================ OB = OB
< search. Subgoal 5.2.16: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.16: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.16: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.16.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 > I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.16.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 > I2 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.17: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (greater E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.17: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (greater E1 E2) L EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.17: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (greater E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.17.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 > I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 O1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 O2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O2 * EvA3 : I1 <= I2 EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.17.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB I1 EE1 I2 E2 E1 L2 L3 I3 EE2 O3 I4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (greater E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (intVal I1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (intVal I2) EE_A' O4 * EvA3 : I1 <= I2 EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (intVal I3) EE2 O3 EvB1 : evalExpr FE EE2 E2 (intVal I4) EE_B' O4 EvB2 : I3 <= I4 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.18: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.18: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.18: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V EE1 O1 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.18.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB V EE1 E2 E1 L2 L3 V1 EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O1 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 O2 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V EE1 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB3. Subgoal 5.2.18.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB V EE1 E2 E1 L2 L3 V1 EE2 O3 V2 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) trueVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V EE1 O3 * EvA2 : evalExpr FE EE1 E2 V EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V1 EE2 O3 EvB1 : evalExpr FE EE2 E2 V2 EE_B' O4 EvB2 : V1 = V2 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.19: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (eq E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.19: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (eq E1 E2) L EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.19: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvB : evalExpr FE EE_B (eq E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB2. Subgoal 5.2.19.1: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB V1 EE1 V2 E2 E1 L2 L3 V EE2 O3 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V EE2 O3 EvB1 : evalExpr FE EE2 E2 V EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 O1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 O2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB V1 EE1 V2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.19.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB V1 EE1 V2 E2 E1 L2 L3 V3 EE2 O3 V4 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (eq E1 E2) falseVal EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : V1 = V2 -> false EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : V3 = V4 -> false EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.20: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (stringLit S) L EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ EvB : evalExpr FE EE_B (stringLit S) VB EE_B' OB ============================ [] = OB
< case EvB. Subgoal 5.2.20: Variables: SF SG PC L FE EE_A' EE_B' S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (stringLit S) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (stringLit S) L EvA : evalExpr FE EE_A' (stringLit S) (stringVal S) EE_A' [] @ ============================ [] = []
< search. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (appString E1 E2) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (appString E1 E2) L EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (appString E1 E2) L EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvB : evalExpr FE EE_B (appString E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 O1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O1 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 S2 O2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O2 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB S1 EE1 S2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O4 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 5.2.21: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB S1 EE1 S2 S E2 E1 L2 L3 S4 EE2 O3 S5 O4 S3 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (appString E1 E2) (stringVal S) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (stringVal S1) EE1 O3 * EvA2 : evalExpr FE EE1 E2 (stringVal S2) EE_A' O4 * EvA3 : S1 ++ S2 = S EvA4 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 Lev : level SF SG PC E1 L2 Lev1 : level SF SG PC E2 L3 Lev2 : join L2 L3 L EvB : evalExpr FE EE_B E1 (stringVal S4) EE2 O3 EvB1 : evalExpr FE EE2 E2 (stringVal S5) EE_B' O4 EvB2 : S4 ++ S5 = S3 EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.2.22: Variables: SF SG PC L FE EE_A' VA EE_B EE_B' VB OB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : level SF SG PC (name X) L EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvB : evalExpr FE EE_B (name X) VB EE_B' OB EvA1 : lookupScopes X EE_A' VA ============================ [] = OB
< case EvB. Subgoal 5.2.22: Variables: SF SG PC L FE EE_A' VA EE_B' VB X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (name X) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : level SF SG PC (name X) L EvA : evalExpr FE EE_A' (name X) VA EE_A' [] @ EvA1 : lookupScopes X EE_A' VA H1 : lookupScopes X EE_B' VB ============================ [] = []
< search. Subgoal 5.2.23: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (call Fun Args) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) L EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA ============================ OA = OB
< case IsE. Subgoal 5.2.23: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) L EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvB : evalExpr FE EE_B (call Fun Args) VB EE_B' OB EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.23: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (call Fun Args) L EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ OA = OB
< apply IH_A to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs ============================ OA = OB
< apply evalArgs_isValue to _ _ _ EvA2. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals ============================ OA = OB
< apply evalArgs_isValue to _ _ _ EvB1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 ============================ OA = OB
< apply lookup_unique to EvB EvA1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 ============================ OA = OB
< FR: case SFC (keep). Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG ============================ OA = OB
< FS: apply FR to Lev EvA1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 ============================ OA = OB
< LAV: apply args_level to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 ============================ OA = OB
< PE': apply zip_level_arg_vals to LAV EvA3 EvB2 FS. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] ============================ OA = OB
< apply public_equiv_add_other to PE' _ with X = RetVar VA = RVVal VB = RVVal L = private. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] ============================ OA = OB
< IsFP: apply lookup_is_value_funCtx to _ EvA1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ OA = OB
< IsF: case IsFP. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ OA = OB
< IsF: case IsF1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ OA = OB
< IsF: case IsF2. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ OA = OB
< apply zip_is to _ _ EvA3. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv ============================ OA = OB
< apply zip_is to _ _ EvB2. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 ============================ OA = OB
< apply levelArgs_is to _ _ _ Lev1. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : is_list is_slev ArgLevs ============================ OA = OB
< apply zip_names_same to _ _ with ZA = (RetVar, RVVal)::InitEnv1 ZB = (RetVar, private)::ZP. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : is_list is_slev ArgLevs H9 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, private)::ZP] ============================ OA = OB
< apply zip_names_same to _ _ with ZA = (RetVar, RVVal)::InitEnv ZB = (RetVar, private)::ZP. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : is_list is_slev ArgLevs H9 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, private)::ZP] H10 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] ============================ OA = OB
< apply zip_is_sec to _ _ _ with Z = (RetVar, private)::ZP. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : is_list is_slev ArgLevs H9 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, private)::ZP] H10 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] H11 : is_list (is_pair is_string is_slev) ((RetVar, private)::ZP) ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ FS1 EvA4 EvB3. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O4 * EvA5 : O3 ++ O4 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : is_list is_slev ArgLevs H9 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, private)::ZP] H10 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] H11 : is_list (is_pair is_string is_slev) ((RetVar, private)::ZP) ============================ OA = OB
< apply append_unique to EvA5 EvB4. Subgoal 5.2.23.1: Variables: SF SG FE EE_A EE_A' VA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev private IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OB @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O4 * EvA5 : O3 ++ O4 = OB EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (private, ArgLevs) Lev1 : levelArgs SF SG private Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, private)::ZP] private Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : public_equiv [(RetVar, private)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H6 : is_list (is_pair is_string is_value) InitEnv H7 : is_list (is_pair is_string is_value) InitEnv1 H8 : is_list is_slev ArgLevs H9 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, private)::ZP] H10 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, private)::ZP] H11 : is_list (is_pair is_string is_slev) ((RetVar, private)::ZP) ============================ OB = OB
< search. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O1 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O1 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs ============================ OA = OB
< apply IH_A to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs ============================ OA = OB
< apply evalArgs_isValue to _ _ _ EvA2. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals ============================ OA = OB
< apply evalArgs_isValue to _ _ _ EvB1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames1 ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar1 EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 ============================ OA = OB
< apply lookup_unique to EvB EvA1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 ============================ OA = OB
< FR: case SFC (keep). Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG ============================ OA = OB
< FS: apply FR to Lev EvA1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 ============================ OA = OB
< LAV: apply args_level to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 ============================ OA = OB
< PE': apply zip_level_arg_vals to LAV EvA3 EvB2 FS. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] ============================ OA = OB
< apply lookupSecFun_is to _ Lev. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs ============================ OA = OB
< assert public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1]. Subgoal 5.2.23.2.1: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs ============================ public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1]
< Or: apply is_slev_public_or_not to _ with L = L. Subgoal 5.2.23.2.1: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs Or : L = public \/ (L = public -> false) ============================ public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1]
< case Or. Subgoal 5.2.23.2.1.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev public H6 : is_list is_slev ArgLevs ============================ public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1]
< apply public_equiv_add_public to PE' with X = RetVar V = RVVal. Subgoal 5.2.23.2.1.1: Variables: SF SG FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (public, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, public)::ZP] public Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev public H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] ============================ public_equiv [(RetVar, public)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1]
< search. Subgoal 5.2.23.2.1.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : L = public -> false ============================ public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1]
< apply public_equiv_add_other to PE' _ with X = RetVar VA = RVVal VB = RVVal L = L. Subgoal 5.2.23.2.1.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : L = public -> false H8 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] ============================ public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1]
< search. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] ============================ OA = OB
< IsFP: apply lookup_is_value_funCtx to _ EvA1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsFP : is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)) (RetVar, (RVVal, (ArgNames, Body))) ============================ OA = OB
< IsF: case IsFP. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_pair is_value (is_pair (is_list is_string) is_stmt) (RVVal, (ArgNames, Body)) ============================ OA = OB
< IsF: case IsF1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_pair (is_list is_string) is_stmt (ArgNames, Body) ============================ OA = OB
< IsF: case IsF2. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body ============================ OA = OB
< apply zip_is to _ _ EvA3. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv ============================ OA = OB
< apply zip_is to _ _ EvB2. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv H9 : is_list (is_pair is_string is_value) InitEnv1 ============================ OA = OB
< apply levelArgs_is to _ _ _ Lev1. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv H9 : is_list (is_pair is_string is_value) InitEnv1 H10 : is_list is_slev ArgLevs ============================ OA = OB
< apply zip_names_same to _ _ with ZA = (RetVar, RVVal)::InitEnv1 ZB = (RetVar, L)::ZP. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv H9 : is_list (is_pair is_string is_value) InitEnv1 H10 : is_list is_slev ArgLevs H11 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, L)::ZP] ============================ OA = OB
< apply zip_names_same to _ _ with ZA = (RetVar, RVVal)::InitEnv ZB = (RetVar, L)::ZP. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv H9 : is_list (is_pair is_string is_value) InitEnv1 H10 : is_list is_slev ArgLevs H11 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, L)::ZP] H12 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, L)::ZP] ============================ OA = OB
< apply zip_is_sec to _ _ _ with Z = (RetVar, L)::ZP. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 O2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O2 * EvA5 : O3 ++ O2 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv H9 : is_list (is_pair is_string is_value) InitEnv1 H10 : is_list is_slev ArgLevs H11 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, L)::ZP] H12 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, L)::ZP] H13 : is_list (is_pair is_string is_slev) ((RetVar, L)::ZP) ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ FS1 EvA4 EvB3. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA OA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OA @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O4 * EvA5 : O3 ++ O4 = OA EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv H9 : is_list (is_pair is_string is_value) InitEnv1 H10 : is_list is_slev ArgLevs H11 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, L)::ZP] H12 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, L)::ZP] H13 : is_list (is_pair is_string is_slev) ((RetVar, L)::ZP) ============================ OA = OB
< apply append_unique to EvA5 EvB4. Subgoal 5.2.23.2: Variables: SF SG L FE EE_A EE_A' VA EE_B EE_B' VB OB RetVar RVVal ArgNames Body ArgVals InitEnv EE2 Args Fun ArgVals1 O3 InitEnv1 EE1 O4 ArgLevs ZP SG1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev public IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (call Fun Args) VA EE_A' OB @ EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvA2 : evalArgs FE EE_A Args ArgVals EE_A' O3 * EvA3 : zip ArgNames ArgVals InitEnv EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O4 * EvA5 : O3 ++ O4 = OB EvA6 : lookupScopes RetVar EE2 VA H1 : is_string Fun H2 : is_args Args EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body))) EvB1 : evalArgs FE EE_B Args ArgVals1 EE_B' O3 EvB2 : zip ArgNames ArgVals1 InitEnv1 EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O4 EvB4 : O3 ++ O4 = OB EvB5 : lookupScopes RetVar EE1 VB Lev : lookup SF Fun (L, ArgLevs) Lev1 : levelArgs SF SG public Args ArgLevs H3 : is_list is_value ArgVals H4 : is_list is_value ArgVals1 FR : forall FName RetLev PSecs RetVar RVVal PNames Body, lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG FS : zip ArgNames ArgLevs ZP FS1 : secure SF [(RetVar, L)::ZP] L Body SG1 LAV : level_arg_vals ArgLevs ArgVals ArgVals1 PE' : public_equiv [ZP] [InitEnv] [InitEnv1] H5 : is_slev L H6 : is_list is_slev ArgLevs H7 : public_equiv [(RetVar, L)::ZP] [(RetVar, RVVal)::InitEnv] [(RetVar, RVVal)::InitEnv1] IsF : is_string RetVar IsF1 : is_value RVVal IsF2 : is_list is_string ArgNames IsF3 : is_stmt Body H8 : is_list (is_pair is_string is_value) InitEnv H9 : is_list (is_pair is_string is_value) InitEnv1 H10 : is_list is_slev ArgLevs H11 : names_same [(RetVar, RVVal)::InitEnv1] [(RetVar, L)::ZP] H12 : names_same [(RetVar, RVVal)::InitEnv] [(RetVar, L)::ZP] H13 : is_list (is_pair is_string is_slev) ((RetVar, L)::ZP) ============================ OB = OB
< search. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (stmtExpr S E1) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (stmtExpr S E1) L EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsE. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (stmtExpr S E1) L EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (stmtExpr S E1) VB EE_B' OB EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply names_same_add_scope to NSA. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) ============================ OA = OB
< apply names_same_add_scope to NSB. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) ============================ OA = OB
< apply public_equiv_add_scope to PE. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 O1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O1 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O1 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) ============================ OA = OB
< apply IH_S to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) ============================ OA = OB
< apply evalStmt_isCtx to _ _ _ EvA1. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalStmt_isCtx to _ _ _ EvB. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply secure_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : names_same EE1 SG2 ============================ OA = OB
< apply secure_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : names_same EE1 SG2 H9 : names_same EE2 SG2 ============================ OA = OB
< apply stmt_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : names_same EE1 SG2 H9 : names_same EE2 SG2 H10 : public_equiv SG2 EE1 EE2 ============================ OA = OB
< apply secure_is to _ _ _ Lev. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope O2 E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O2 * EvA3 : O3 ++ O2 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : names_same EE1 SG2 H9 : names_same EE2 SG2 H10 : public_equiv SG2 EE1 EE2 H11 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB EE1 Scope E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OA @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OA H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : names_same EE1 SG2 H9 : names_same EE2 SG2 H10 : public_equiv SG2 EE1 EE2 H11 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.2.24: Variables: SF SG PC L FE EE_A EE_A' VA EE_B EE_B' VB OB EE1 Scope E1 S SG2 EE2 O3 Scope1 O4 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (stmtExpr S E1) VA EE_A' OB @ EvA1 : evalStmt FE ([]::EE_A) S EE1 O3 * EvA2 : evalExpr FE EE1 E1 VA (Scope::EE_A') O4 * EvA3 : O3 ++ O4 = OB H1 : is_stmt S H2 : is_expr E1 Lev : secure SF ([]::SG) PC S SG2 Lev1 : level SF SG2 PC E1 L EvB : evalStmt FE ([]::EE_B) S EE2 O3 EvB1 : evalExpr FE EE2 E1 VB (Scope1::EE_B') O4 EvB2 : O3 ++ O4 = OB H3 : names_same ([]::EE_A) ([]::SG) H4 : names_same ([]::EE_B) ([]::SG) H5 : public_equiv ([]::SG) ([]::EE_A) ([]::EE_B) H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : names_same EE1 SG2 H9 : names_same EE2 SG2 H10 : public_equiv SG2 EE1 EE2 H11 : is_list (is_list (is_pair is_string is_slev)) SG2 ============================ OB = OB
< search. Subgoal 5.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (recBuild RF) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recBuild RF) L EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * ============================ OA = OB
< case IsE. Subgoal 5.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recBuild RF) L EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB VF RF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvB : evalExpr FE EE_B (recBuild RF) VB EE_B' OB EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.25: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB VF RF VF1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OA @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OA * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ OA = OB
< apply IH_RF to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.25: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB VF RF VF1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recBuild RF) (recVal VF) EE_A' OB @ EvA1 : evalRecFields FE EE_A RF VF EE_A' OB * H1 : is_recFieldExprs RF Lev : levelRecFields SF SG PC RF L EvB : evalRecFields FE EE_B RF VF1 EE_B' OB ============================ OB = OB
< search. Subgoal 5.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr (recFieldAccess Rec F) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recFieldAccess Rec F) L EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA ============================ OA = OB
< case IsE. Subgoal 5.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC (recFieldAccess Rec F) L EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB EE_B' OB EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L ============================ OA = OB
< EvB: case EvB. Subgoal 5.2.26: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Fields F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OA * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.2.26: Variables: SF SG PC L FE EE_A EE_A' VA EE_B EE_B' VB OB Fields F Rec Fields1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A (recFieldAccess Rec F) VA EE_A' OB @ EvA1 : evalExpr FE EE_A Rec (recVal Fields) EE_A' OB * EvA2 : lookup Fields F VA H1 : is_expr Rec H2 : is_string F Lev : level SF SG PC Rec L EvB : evalExpr FE EE_B Rec (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 F VB ============================ OB = OB
< search. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : level SF SG PC <unknown K evalExpr> L EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * ============================ OA = OB
< Lev: case Lev. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L ============================ OA = OB
< apply names_is to _ EvA1. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names ============================ OA = OB
< apply names_is_sec to _ Lev. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ OA = OB
< apply proj_expr_unique to Lev1 EvA2 _ _ _ _ _. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names -> mem X Names1
< intros M. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names ============================ mem X Names1
< apply names_same_names to NSA EvA1 Lev M. Subgoal 5.2.27.1: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names H3 : mem X Names1 ============================ mem X Names1
< search. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ forall X, mem X Names1 -> mem X Names
< intros M. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 ============================ mem X Names
< apply names_same_names_back to NSA EvA1 Lev M. Subgoal 5.2.27.2: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 E_P1 X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P1 Lev2 : level SF SG PC E_P1 L H1 : is_list is_string Names H2 : is_list is_string Names1 M : mem X Names1 H3 : mem X Names ============================ mem X Names
< search. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 ============================ OA = OB
< apply proj_expr_is to Lev1 _ _. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P ============================ OA = OB
< NSB-: apply names_same_symmetric to NSB. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B ============================ OA = OB
< NSAB: apply names_same_transitive to NSA NSB-. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B ============================ OA = OB
< NamesB: apply names_exists to IsEE_B. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N ============================ OA = OB
< apply names_is to _ EvA1. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names ============================ OA = OB
< apply names_is to _ NamesB. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N ============================ OA = OB
< PrB: apply proj_expr_other to EvA2 _ _ _ with L' = N. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ OA = OB
< apply proj_expr_unique to EvA2 PrB _ _ _ _ _. Subgoal 5.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ forall X, mem X N -> mem X Names
< intros M. Subgoal 5.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N ============================ mem X Names
< NSBA: apply names_same_symmetric to NSAB. Subgoal 5.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N NSBA : names_same EE_B EE_A ============================ mem X Names
< apply names_same_names to NSBA NamesB EvA1 M. Subgoal 5.2.27.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X N NSBA : names_same EE_B EE_A H6 : mem X Names ============================ mem X Names
< search. Subgoal 5.2.27.4: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ forall X, mem X Names -> mem X N
< intros M. Subgoal 5.2.27.4: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X Names ============================ mem X N
< apply names_same_names to NSAB EvA1 NamesB M. Subgoal 5.2.27.4: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names E_P V_P EE_P O_P Names1 N E'' X IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E_P EvA3 : evalExpr FE EE_A E_P V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E_P Lev2 : level SF SG PC E_P L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E_P NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' M : mem X Names H6 : mem X N ============================ mem X N
< search. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' ============================ OA = OB
< EvB': apply proj_evalExpr_forward to PrB NamesB _ _ _ EvB. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' ============================ OA = OB
< EvA': apply proj_evalExpr_forward to EvA2 EvA1 _ _ _ EvA. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' EE''1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> VA EE_A' OA @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' VA EE''1 OA EvA'1 : scopes_same EE_A' EE''1 ============================ OA = OB
< apply evalExpr_unique to _ _ _ EvA' EvA3. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P ============================ O_P = OB
< apply proj_expr_is to PrB _ _. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P O_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' O_P @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P O_P * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P O_P EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' ============================ O_P = OB
< PE_Pr: apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev2 EvA3 EvB'. Subgoal 5.2.27: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' VB OB Names V_P EE_P Names1 N E'' EE'' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsE : is_expr <unknown K evalExpr> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalExpr FE EE_A <unknown K evalExpr> V_P EE_A' OB @ EvB : evalExpr FE EE_B <unknown K evalExpr> VB EE_B' OB EvA1 : names EE_A Names EvA2 : Names |{expr}- <unknown K evalExpr> ~~> E'' EvA3 : evalExpr FE EE_A E'' V_P EE_P OB * Lev : names SG Names1 Lev1 : Names1 |{expr}- <unknown K evalExpr> ~~> E'' Lev2 : level SF SG PC E'' L H1 : is_list is_string Names H2 : is_list is_string Names1 H3 : is_expr E'' NSB- : names_same SG EE_B NSAB : names_same EE_A EE_B NamesB : names EE_B N H4 : is_list is_string Names H5 : is_list is_string N PrB : N |{expr}- <unknown K evalExpr> ~~> E'' EvB' : evalExpr FE EE_B E'' VB EE'' OB EvB'1 : scopes_same EE_B' EE'' EvA' : evalExpr FE EE_A E'' V_P EE_P OB EvA'1 : scopes_same EE_A' EE_P H6 : is_expr E'' ============================ OB = OB
< search. Subgoal 5.3.1: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : levelArgs SF SG PC nilArgs L EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ EvB : evalArgs FE EE_B nilArgs VB EE_B' OB ============================ [] = OB
< case EvB. Subgoal 5.3.1: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsA : is_args nilArgs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : levelArgs SF SG PC nilArgs L EvA : evalArgs FE EE_A' nilArgs [] EE_A' [] @ ============================ [] = []
< search. Subgoal 5.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsA : is_args (consArgs E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC (consArgs E Rest) L EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsA. Subgoal 5.3.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC (consArgs E Rest) L EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest ============================ OA = OB
< Lev: case Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V Rest E Rest1 L1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvB : evalArgs FE EE_B (consArgs E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 ============================ OA = OB
< EvB: case EvB. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_A to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' OA EE_B EE_B' OB EE1 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.3.2: Variables: SF SG PC FE EE_A EE_A' EE_B EE_B' OB EE1 VRest V Rest E Rest1 L1 EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalArgs FE EE_A (consArgs E Rest) (V::VRest) EE_A' OB @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalArgs FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E H2 : is_args Rest Lev : level SF SG PC E L1 Lev1 : levelArgs SF SG PC Rest Rest1 EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalArgs FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : names_same EE1 SG H6 : names_same EE2 SG H7 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.3.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsA : is_args <unknown K evalArgs> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelArgs SF SG PC <unknown K evalArgs> L EvA : evalArgs FE EE_A <unknown K evalArgs> VA EE_A' OA @ EvB : evalArgs FE EE_B <unknown K evalArgs> VB EE_B' OB ============================ OA = OB
< case Lev. Subgoal 5.4.1: Variables: SF SG PC L FE EE_A' EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B SG PE : public_equiv SG EE_A' EE_B Lev : levelRecFields SF SG PC nilRecFieldExprs L EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ EvB : evalRecFields FE EE_B nilRecFieldExprs VB EE_B' OB ============================ [] = OB
< case EvB. Subgoal 5.4.1: Variables: SF SG PC L FE EE_A' EE_B' IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsRF : is_recFieldExprs nilRecFieldExprs IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A' IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B' SFC : secFunCtxs SF FE NSA : names_same EE_A' SG NSB : names_same EE_B' SG PE : public_equiv SG EE_A' EE_B' Lev : levelRecFields SF SG PC nilRecFieldExprs L EvA : evalRecFields FE EE_A' nilRecFieldExprs [] EE_A' [] @ ============================ [] = []
< search. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsRF : is_recFieldExprs (consRecFieldExprs F E Rest) IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsRF. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC (consRecFieldExprs F E Rest) L EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest ============================ OA = OB
< Lev: case Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' VB OB EE1 O1 O2 VRest V F Rest E LE LRF IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB EE_B' OB EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L ============================ OA = OB
< EvB: case EvB. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O1 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvA1 Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG ============================ OA = OB
< apply level_eval_names_same to _ _ _ _ _ _ EvB Lev. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG ============================ OA = OB
< apply expr_secure to _ _ _ _ _ _ _ _ _ _ _ Lev EvA1 EvB. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply IH_RF to _ _ _ _ _ _ _ _ _ _ _ Lev1 EvA2 EvB1. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' OA EE_B EE_B' OB EE1 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OA @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE1 EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 5.4.2: Variables: SF SG PC L FE EE_A EE_A' EE_B EE_B' OB EE1 VRest V F Rest E LE LRF EE2 O3 O4 VRest1 V1 IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B EvA : evalRecFields FE EE_A (consRecFieldExprs F E Rest) ((F, V)::VRest) EE_A' OB @ EvA1 : evalExpr FE EE_A E V EE1 O3 * EvA2 : evalRecFields FE EE1 Rest VRest EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_string F H2 : is_expr E H3 : is_recFieldExprs Rest Lev : level SF SG PC E LE Lev1 : levelRecFields SF SG PC Rest LRF Lev2 : join LE LRF L EvB : evalExpr FE EE_B E V1 EE2 O3 EvB1 : evalRecFields FE EE2 Rest VRest1 EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : names_same EE1 SG H7 : names_same EE2 SG H8 : public_equiv SG EE1 EE2 ============================ OB = OB
< search. Subgoal 5.4.3: Variables: SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB IH_S : forall S SF SG PC SG' FE ScopeA EE_A EE_A' OA ScopeB EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (ScopeA::EE_A) -> is_list (is_list (is_pair is_string is_value)) (ScopeB::EE_B) -> secFunCtxs SF FE -> names_same (ScopeA::EE_A) SG -> names_same (ScopeB::EE_B) SG -> public_equiv SG (ScopeA::EE_A) (ScopeB::EE_B) -> secure SF SG PC S SG' -> evalStmt FE (ScopeA::EE_A) S EE_A' OA * -> evalStmt FE (ScopeB::EE_B) S EE_B' OB -> OA = OB IH_E : forall E SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_expr E -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> level SF SG PC E L -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> OA = OB IH_A : forall A SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_args A -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelArgs SF SG PC A L -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> OA = OB IH_RF : forall RF SF SG PC L FE EE_A EE_A' VA OA EE_B EE_B' VB OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF -> is_list (is_list (is_pair is_string is_slev)) SG -> is_slev PC -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> secFunCtxs SF FE -> names_same EE_A SG -> names_same EE_B SG -> public_equiv SG EE_A EE_B -> levelRecFields SF SG PC RF L -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> OA = OB IsRF : is_recFieldExprs <unknown K evalRecFields> IsSF : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsSG : is_list (is_list (is_pair is_string is_slev)) SG IsPC : is_slev PC IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE_A : is_list (is_list (is_pair is_string is_value)) EE_A IsEE_B : is_list (is_list (is_pair is_string is_value)) EE_B SFC : secFunCtxs SF FE NSA : names_same EE_A SG NSB : names_same EE_B SG PE : public_equiv SG EE_A EE_B Lev : levelRecFields SF SG PC <unknown K evalRecFields> L EvA : evalRecFields FE EE_A <unknown K evalRecFields> VA EE_A' OA @ EvB : evalRecFields FE EE_B <unknown K evalRecFields> VB EE_B' OB ============================ OA = OB
< case Lev. Proof completed.
< Extensible_Theorem paramSec_is : forall P Name L, IsP : is_param P -> PS : paramSec P Name L -> is_string Name /\ is_slev L on PS. Subgoal 1: Variables: Name Ty IH : forall P Name L, is_param P -> paramSec P Name L * -> is_string Name /\ is_slev L IsP : is_param (param Name Ty) PS : paramSec (param Name Ty) Name public @ ============================ is_string Name /\ is_slev public
< case IsP. Subgoal 1: Variables: Name Ty IH : forall P Name L, is_param P -> paramSec P Name L * -> is_string Name /\ is_slev L PS : paramSec (param Name Ty) Name public @ H1 : is_string Name H2 : is_typ Ty ============================ is_string Name /\ is_slev public
< search. Subgoal 2: Variables: Name L Ty IH : forall P Name L, is_param P -> paramSec P Name L * -> is_string Name /\ is_slev L IsP : is_param (secparam Name Ty L) PS : paramSec (secparam Name Ty L) Name L @ ============================ is_string Name /\ is_slev L
< case IsP. Subgoal 2: Variables: Name L Ty IH : forall P Name L, is_param P -> paramSec P Name L * -> is_string Name /\ is_slev L PS : paramSec (secparam Name Ty L) Name L @ H1 : is_string Name H2 : is_typ Ty H3 : is_slev L ============================ is_string Name /\ is_slev L
< search. Subgoal 3: Variables: Name L P_P IH : forall P Name L, is_param P -> paramSec P Name L * -> is_string Name /\ is_slev L IsP : is_param <unknown I param> PS : paramSec <unknown I param> Name L @ PS1 : |{param}- <unknown I param> ~~> P_P PS2 : paramSec P_P Name L * ============================ is_string Name /\ is_slev L
< apply proj_param_is to PS1 _. Subgoal 3: Variables: Name L P_P IH : forall P Name L, is_param P -> paramSec P Name L * -> is_string Name /\ is_slev L IsP : is_param <unknown I param> PS : paramSec <unknown I param> Name L @ PS1 : |{param}- <unknown I param> ~~> P_P PS2 : paramSec P_P Name L * H1 : is_param P_P ============================ is_string Name /\ is_slev L
< apply IH to _ PS2. Subgoal 3: Variables: Name L P_P IH : forall P Name L, is_param P -> paramSec P Name L * -> is_string Name /\ is_slev L IsP : is_param <unknown I param> PS : paramSec <unknown I param> Name L @ PS1 : |{param}- <unknown I param> ~~> P_P PS2 : paramSec P_P Name L * H1 : is_param P_P H2 : is_string Name H3 : is_slev L ============================ is_string Name /\ is_slev L
< search. Proof completed.
< Theorem paramSecs_is : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs -> is_list (is_pair is_string is_slev) PSecs. ============================ forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs -> is_list (is_pair is_string is_slev) PSecs
< induction on 2. IH : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs * -> is_list (is_pair is_string is_slev) PSecs ============================ forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs @ -> is_list (is_pair is_string is_slev) PSecs
< intros IsPs PS. Variables: Ps PSecs IH : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs * -> is_list (is_pair is_string is_slev) PSecs IsPs : is_list is_param Ps PS : paramSecs Ps PSecs @ ============================ is_list (is_pair is_string is_slev) PSecs
< PS: case PS. Subgoal 1: IH : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs * -> is_list (is_pair is_string is_slev) PSecs IsPs : is_list is_param [] ============================ is_list (is_pair is_string is_slev) []
< search. Subgoal 2: Variables: SRest L Name PRest P IH : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs * -> is_list (is_pair is_string is_slev) PSecs IsPs : is_list is_param (P::PRest) PS : paramSec P Name L PS1 : paramSecs PRest SRest * ============================ is_list (is_pair is_string is_slev) ((Name, L)::SRest)
< case IsPs. Subgoal 2: Variables: SRest L Name PRest P IH : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs * -> is_list (is_pair is_string is_slev) PSecs PS : paramSec P Name L PS1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest ============================ is_list (is_pair is_string is_slev) ((Name, L)::SRest)
< apply paramSec_is to _ PS. Subgoal 2: Variables: SRest L Name PRest P IH : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs * -> is_list (is_pair is_string is_slev) PSecs PS : paramSec P Name L PS1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest H3 : is_string Name H4 : is_slev L ============================ is_list (is_pair is_string is_slev) ((Name, L)::SRest)
< apply IH to _ PS1. Subgoal 2: Variables: SRest L Name PRest P IH : forall Ps PSecs, is_list is_param Ps -> paramSecs Ps PSecs * -> is_list (is_pair is_string is_slev) PSecs PS : paramSec P Name L PS1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest H3 : is_string Name H4 : is_slev L H5 : is_list (is_pair is_string is_slev) SRest ============================ is_list (is_pair is_string is_slev) ((Name, L)::SRest)
< search. Proof completed.
< Theorem values_is_sec : forall L V, is_list (is_pair is_string is_slev) L -> values L V -> is_list is_slev V. ============================ forall L V, is_list (is_pair is_string is_slev) L -> values L V -> is_list is_slev V
< induction on 2. IH : forall L V, is_list (is_pair is_string is_slev) L -> values L V * -> is_list is_slev V ============================ forall L V, is_list (is_pair is_string is_slev) L -> values L V @ -> is_list is_slev V
< intros IsL V. Variables: L V IH : forall L V, is_list (is_pair is_string is_slev) L -> values L V * -> is_list is_slev V IsL : is_list (is_pair is_string is_slev) L V : values L V @ ============================ is_list is_slev V
< V: case V. Subgoal 1: IH : forall L V, is_list (is_pair is_string is_slev) L -> values L V * -> is_list is_slev V IsL : is_list (is_pair is_string is_slev) [] ============================ is_list is_slev []
< search. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_slev) L -> values L V * -> is_list is_slev V IsL : is_list (is_pair is_string is_slev) ((A, B)::Rest) V : values Rest VRest * ============================ is_list is_slev (B::VRest)
< Is: case IsL. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_slev) L -> values L V * -> is_list is_slev V V : values Rest VRest * Is : is_pair is_string is_slev (A, B) Is1 : is_list (is_pair is_string is_slev) Rest ============================ is_list is_slev (B::VRest)
< case Is. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_slev) L -> values L V * -> is_list is_slev V V : values Rest VRest * Is1 : is_list (is_pair is_string is_slev) Rest H1 : is_string A H2 : is_slev B ============================ is_list is_slev (B::VRest)
< apply IH to _ V. Subgoal 2: Variables: VRest B Rest A IH : forall L V, is_list (is_pair is_string is_slev) L -> values L V * -> is_list is_slev V V : values Rest VRest * Is1 : is_list (is_pair is_string is_slev) Rest H1 : is_string A H2 : is_slev B H3 : is_list is_slev VRest ============================ is_list is_slev (B::VRest)
< search. Proof completed.
< Extensible_Theorem getFunSec_is : forall F Name RetLev PSecs, IsF : is_fun F -> GFS : getFunSec F Name RetLev PSecs -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs on GFS. Subgoal 1: Variables: Name PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs IsF : is_fun (fun Name RetTy RetVar RVVal Params Body) GFS : getFunSec (fun Name RetTy RetVar RVVal Params Body) Name public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs ============================ (is_string Name /\ is_slev public) /\ is_list is_slev PSecs
< case IsF. Subgoal 1: Variables: Name PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs GFS : getFunSec (fun Name RetTy RetVar RVVal Params Body) Name public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string Name H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body ============================ (is_string Name /\ is_slev public) /\ is_list is_slev PSecs
< apply paramSecs_is to _ GFS1. Subgoal 1: Variables: Name PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs GFS : getFunSec (fun Name RetTy RetVar RVVal Params Body) Name public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string Name H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body H7 : is_list (is_pair is_string is_slev) ParamSecs ============================ (is_string Name /\ is_slev public) /\ is_list is_slev PSecs
< apply values_is_sec to _ GFS2. Subgoal 1: Variables: Name PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs GFS : getFunSec (fun Name RetTy RetVar RVVal Params Body) Name public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string Name H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body H7 : is_list (is_pair is_string is_slev) ParamSecs H8 : is_list is_slev PSecs ============================ (is_string Name /\ is_slev public) /\ is_list is_slev PSecs
< search. Subgoal 2: Variables: Name RetLev PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs IsF : is_fun (secfun Name RetTy RetLev RetVar RVVal Params Body) GFS : getFunSec (secfun Name RetTy RetLev RetVar RVVal Params Body) Name RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs ============================ (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs
< case IsF. Subgoal 2: Variables: Name RetLev PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs GFS : getFunSec (secfun Name RetTy RetLev RetVar RVVal Params Body) Name RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string Name H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body ============================ (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs
< apply paramSecs_is to _ GFS1. Subgoal 2: Variables: Name RetLev PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs GFS : getFunSec (secfun Name RetTy RetLev RetVar RVVal Params Body) Name RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string Name H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body H8 : is_list (is_pair is_string is_slev) ParamSecs ============================ (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs
< apply values_is_sec to _ GFS2. Subgoal 2: Variables: Name RetLev PSecs ParamSecs Body Params RVVal RetVar RetTy IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs GFS : getFunSec (secfun Name RetTy RetLev RetVar RVVal Params Body) Name RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string Name H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body H8 : is_list (is_pair is_string is_slev) ParamSecs H9 : is_list is_slev PSecs ============================ (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs
< search. Subgoal 3: Variables: Name RetLev PSecs F_P IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs IsF : is_fun <unknown I fun> GFS : getFunSec <unknown I fun> Name RetLev PSecs @ GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P Name RetLev PSecs * ============================ (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs
< apply proj_fun_is to GFS1 _. Subgoal 3: Variables: Name RetLev PSecs F_P IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs IsF : is_fun <unknown I fun> GFS : getFunSec <unknown I fun> Name RetLev PSecs @ GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P Name RetLev PSecs * H1 : is_fun F_P ============================ (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs
< apply IH to _ GFS2. Subgoal 3: Variables: Name RetLev PSecs F_P IH : forall F Name RetLev PSecs, is_fun F -> getFunSec F Name RetLev PSecs * -> (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs IsF : is_fun <unknown I fun> GFS : getFunSec <unknown I fun> Name RetLev PSecs @ GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P Name RetLev PSecs * H1 : is_fun F_P H2 : is_string Name H3 : is_slev RetLev H4 : is_list is_slev PSecs ============================ (is_string Name /\ is_slev RetLev) /\ is_list is_slev PSecs
< search. Proof completed.
< Theorem gatherFunSecCtx_is : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF. ============================ forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
< induction on 2. IH : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF * -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ============================ forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF @ -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
< intros IsFs GFSC. Variables: Fs SF IH : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF * -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsFs : is_list is_fun Fs GFSC : gatherFunSecCtx Fs SF @ ============================ is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF
< GFSC: case GFSC. Subgoal 1: IH : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF * -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsFs : is_list is_fun [] ============================ is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) []
< search. Subgoal 2: Variables: SRest PSecs Lev Name FRest F IH : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF * -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF IsFs : is_list is_fun (F::FRest) GFSC : getFunSec F Name Lev PSecs GFSC1 : gatherFunSecCtx FRest SRest * ============================ is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) ((Name, (Lev, PSecs))::SRest)
< case IsFs. Subgoal 2: Variables: SRest PSecs Lev Name FRest F IH : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF * -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF GFSC : getFunSec F Name Lev PSecs GFSC1 : gatherFunSecCtx FRest SRest * H1 : is_fun F H2 : is_list is_fun FRest ============================ is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) ((Name, (Lev, PSecs))::SRest)
< apply getFunSec_is to _ GFSC. Subgoal 2: Variables: SRest PSecs Lev Name FRest F IH : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF * -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF GFSC : getFunSec F Name Lev PSecs GFSC1 : gatherFunSecCtx FRest SRest * H1 : is_fun F H2 : is_list is_fun FRest H3 : is_string Name H4 : is_slev Lev H5 : is_list is_slev PSecs ============================ is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) ((Name, (Lev, PSecs))::SRest)
< apply IH to _ GFSC1. Subgoal 2: Variables: SRest PSecs Lev Name FRest F IH : forall Fs SF, is_list is_fun Fs -> gatherFunSecCtx Fs SF * -> is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF GFSC : getFunSec F Name Lev PSecs GFSC1 : gatherFunSecCtx FRest SRest * H1 : is_fun F H2 : is_list is_fun FRest H3 : is_string Name H4 : is_slev Lev H5 : is_list is_slev PSecs H6 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SRest ============================ is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) ((Name, (Lev, PSecs))::SRest)
< search. Proof completed.
< Extensible_Theorem program_secure_is : forall P S, IsP : is_program P -> Sec : programSecure P S -> is_list is_slev S on Sec. Subgoal 1: Variables: S SF Name RetLev Main Funs IH : forall P S, is_program P -> programSecure P S * -> is_list is_slev S IsP : is_program (program Funs Main) Sec : programSecure (program Funs Main) S @ Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev S Sec3 : funsSecure ((Name, (RetLev, S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, S))::SF) Main ============================ is_list is_slev S
< case IsP. Subgoal 1: Variables: S SF Name RetLev Main Funs IH : forall P S, is_program P -> programSecure P S * -> is_list is_slev S Sec : programSecure (program Funs Main) S @ Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev S Sec3 : funsSecure ((Name, (RetLev, S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main ============================ is_list is_slev S
< apply getFunSec_is to _ Sec2. Subgoal 1: Variables: S SF Name RetLev Main Funs IH : forall P S, is_program P -> programSecure P S * -> is_list is_slev S Sec : programSecure (program Funs Main) S @ Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev S Sec3 : funsSecure ((Name, (RetLev, S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main H3 : is_string Name H4 : is_slev RetLev H5 : is_list is_slev S ============================ is_list is_slev S
< search. Subgoal 2: Variables: S P_P IH : forall P S, is_program P -> programSecure P S * -> is_list is_slev S IsP : is_program <unknown I program> Sec : programSecure <unknown I program> S @ Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P S * ============================ is_list is_slev S
< apply proj_program_is to Sec1 _. Subgoal 2: Variables: S P_P IH : forall P S, is_program P -> programSecure P S * -> is_list is_slev S IsP : is_program <unknown I program> Sec : programSecure <unknown I program> S @ Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P S * H1 : is_program P_P ============================ is_list is_slev S
< apply IH to _ Sec2. Subgoal 2: Variables: S P_P IH : forall P S, is_program P -> programSecure P S * -> is_list is_slev S IsP : is_program <unknown I program> Sec : programSecure <unknown I program> S @ Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P S * H1 : is_program P_P H2 : is_list is_slev S ============================ is_list is_slev S
< search. Proof completed.
< Extensible_Theorem paramSec_unique : forall P NameA LA NameB LB, IsP : is_param P -> PSA : paramSec P NameA LA -> PSB : paramSec P NameB LB -> NameA = NameB /\ LA = LB on PSA. Subgoal 1: Variables: NameA NameB LB Ty IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param (param NameA Ty) PSA : paramSec (param NameA Ty) NameA public @ PSB : paramSec (param NameA Ty) NameB LB ============================ NameA = NameB /\ public = LB
< case PSB. Subgoal 1: Variables: NameB Ty IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param (param NameB Ty) PSA : paramSec (param NameB Ty) NameB public @ ============================ NameB = NameB /\ public = public
< search. Subgoal 2: Variables: NameA LA NameB LB Ty IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param (secparam NameA Ty LA) PSA : paramSec (secparam NameA Ty LA) NameA LA @ PSB : paramSec (secparam NameA Ty LA) NameB LB ============================ NameA = NameB /\ LA = LB
< case PSB. Subgoal 2: Variables: NameB LB Ty IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param (secparam NameB Ty LB) PSA : paramSec (secparam NameB Ty LB) NameB LB @ ============================ NameB = NameB /\ LB = LB
< search. Subgoal 3: Variables: NameA LA NameB LB P_P IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param <unknown I param> PSA : paramSec <unknown I param> NameA LA @ PSB : paramSec <unknown I param> NameB LB PSA1 : |{param}- <unknown I param> ~~> P_P PSA2 : paramSec P_P NameA LA * ============================ NameA = NameB /\ LA = LB
< PSB: case PSB. Subgoal 3: Variables: NameA LA NameB LB P_P P_P1 IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param <unknown I param> PSA : paramSec <unknown I param> NameA LA @ PSA1 : |{param}- <unknown I param> ~~> P_P PSA2 : paramSec P_P NameA LA * PSB : |{param}- <unknown I param> ~~> P_P1 PSB1 : paramSec P_P1 NameB LB ============================ NameA = NameB /\ LA = LB
< apply proj_param_unique to PSB PSA1 _. Subgoal 3: Variables: NameA LA NameB LB P_P IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param <unknown I param> PSA : paramSec <unknown I param> NameA LA @ PSA1 : |{param}- <unknown I param> ~~> P_P PSA2 : paramSec P_P NameA LA * PSB : |{param}- <unknown I param> ~~> P_P PSB1 : paramSec P_P NameB LB ============================ NameA = NameB /\ LA = LB
< apply proj_param_is to PSA1 _. Subgoal 3: Variables: NameA LA NameB LB P_P IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param <unknown I param> PSA : paramSec <unknown I param> NameA LA @ PSA1 : |{param}- <unknown I param> ~~> P_P PSA2 : paramSec P_P NameA LA * PSB : |{param}- <unknown I param> ~~> P_P PSB1 : paramSec P_P NameB LB H1 : is_param P_P ============================ NameA = NameB /\ LA = LB
< apply IH to _ PSA2 PSB1. Subgoal 3: Variables: NameB LB P_P IH : forall P NameA LA NameB LB, is_param P -> paramSec P NameA LA * -> paramSec P NameB LB -> NameA = NameB /\ LA = LB IsP : is_param <unknown I param> PSA : paramSec <unknown I param> NameB LB @ PSA1 : |{param}- <unknown I param> ~~> P_P PSA2 : paramSec P_P NameB LB * PSB : |{param}- <unknown I param> ~~> P_P PSB1 : paramSec P_P NameB LB H1 : is_param P_P ============================ NameB = NameB /\ LB = LB
< search. Proof completed.
< Theorem paramSecs_unique : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA -> paramSecs Ps PSecsB -> PSecsA = PSecsB. ============================ forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA -> paramSecs Ps PSecsB -> PSecsA = PSecsB
< induction on 2. IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB ============================ forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA @ -> paramSecs Ps PSecsB -> PSecsA = PSecsB
< intros IsPs PSA PSB. Variables: Ps PSecsA PSecsB IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB IsPs : is_list is_param Ps PSA : paramSecs Ps PSecsA @ PSB : paramSecs Ps PSecsB ============================ PSecsA = PSecsB
< PSA: case PSA. Subgoal 1: Variables: PSecsB IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB IsPs : is_list is_param [] PSB : paramSecs [] PSecsB ============================ [] = PSecsB
< case PSB. Subgoal 1: IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB IsPs : is_list is_param [] ============================ [] = []
< search. Subgoal 2: Variables: PSecsB SRest L Name PRest P IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB IsPs : is_list is_param (P::PRest) PSB : paramSecs (P::PRest) PSecsB PSA : paramSec P Name L PSA1 : paramSecs PRest SRest * ============================ (Name, L)::SRest = PSecsB
< case IsPs. Subgoal 2: Variables: PSecsB SRest L Name PRest P IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB PSB : paramSecs (P::PRest) PSecsB PSA : paramSec P Name L PSA1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest ============================ (Name, L)::SRest = PSecsB
< PSB: case PSB. Subgoal 2: Variables: SRest L Name PRest P SRest1 L1 Name1 IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB PSA : paramSec P Name L PSA1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest PSB : paramSec P Name1 L1 PSB1 : paramSecs PRest SRest1 ============================ (Name, L)::SRest = (Name1, L1)::SRest1
< apply paramSec_unique to _ PSA PSB. Subgoal 2: Variables: SRest PRest P SRest1 L1 Name1 IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB PSA : paramSec P Name1 L1 PSA1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest PSB : paramSec P Name1 L1 PSB1 : paramSecs PRest SRest1 ============================ (Name1, L1)::SRest = (Name1, L1)::SRest1
< apply IH to _ PSA1 PSB1. Subgoal 2: Variables: PRest P SRest1 L1 Name1 IH : forall Ps PSecsA PSecsB, is_list is_param Ps -> paramSecs Ps PSecsA * -> paramSecs Ps PSecsB -> PSecsA = PSecsB PSA : paramSec P Name1 L1 PSA1 : paramSecs PRest SRest1 * H1 : is_param P H2 : is_list is_param PRest PSB : paramSec P Name1 L1 PSB1 : paramSecs PRest SRest1 ============================ (Name1, L1)::SRest1 = (Name1, L1)::SRest1
< search. Proof completed.
< Extensible_Theorem getFunSec_unique : forall F NA LA PSA NB LB PSB, IsF : is_fun F -> GFSA : getFunSec F NA LA PSA -> GFSB : getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB on GFSA. Subgoal 1: Variables: NA PSA NB LB PSB ParamSecs Body Params RVVal RetVar RetTy IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun (fun NA RetTy RetVar RVVal Params Body) GFSA : getFunSec (fun NA RetTy RetVar RVVal Params Body) NA public PSA @ GFSB : getFunSec (fun NA RetTy RetVar RVVal Params Body) NB LB PSB GFSA1 : paramSecs Params ParamSecs GFSA2 : values ParamSecs PSA ============================ (NA = NB /\ public = LB) /\ PSA = PSB
< GFSB: case GFSB. Subgoal 1: Variables: PSA NB PSB ParamSecs Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun (fun NB RetTy RetVar RVVal Params Body) GFSA : getFunSec (fun NB RetTy RetVar RVVal Params Body) NB public PSA @ GFSA1 : paramSecs Params ParamSecs GFSA2 : values ParamSecs PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSB ============================ (NB = NB /\ public = public) /\ PSA = PSB
< case IsF. Subgoal 1: Variables: PSA NB PSB ParamSecs Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB GFSA : getFunSec (fun NB RetTy RetVar RVVal Params Body) NB public PSA @ GFSA1 : paramSecs Params ParamSecs GFSA2 : values ParamSecs PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSB H1 : is_string NB H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body ============================ (NB = NB /\ public = public) /\ PSA = PSB
< apply paramSecs_unique to _ GFSA1 GFSB. Subgoal 1: Variables: PSA NB PSB Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB GFSA : getFunSec (fun NB RetTy RetVar RVVal Params Body) NB public PSA @ GFSA1 : paramSecs Params ParamSecs1 GFSA2 : values ParamSecs1 PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSB H1 : is_string NB H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body ============================ (NB = NB /\ public = public) /\ PSA = PSB
< apply values_unique to GFSB1 GFSA2. Subgoal 1: Variables: PSA NB Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB GFSA : getFunSec (fun NB RetTy RetVar RVVal Params Body) NB public PSA @ GFSA1 : paramSecs Params ParamSecs1 GFSA2 : values ParamSecs1 PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSA H1 : is_string NB H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body ============================ (NB = NB /\ public = public) /\ PSA = PSA
< search. Subgoal 2: Variables: NA LA PSA NB LB PSB ParamSecs Body Params RVVal RetVar RetTy IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun (secfun NA RetTy LA RetVar RVVal Params Body) GFSA : getFunSec (secfun NA RetTy LA RetVar RVVal Params Body) NA LA PSA @ GFSB : getFunSec (secfun NA RetTy LA RetVar RVVal Params Body) NB LB PSB GFSA1 : paramSecs Params ParamSecs GFSA2 : values ParamSecs PSA ============================ (NA = NB /\ LA = LB) /\ PSA = PSB
< GFSB: case GFSB. Subgoal 2: Variables: PSA NB LB PSB ParamSecs Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun (secfun NB RetTy LB RetVar RVVal Params Body) GFSA : getFunSec (secfun NB RetTy LB RetVar RVVal Params Body) NB LB PSA @ GFSA1 : paramSecs Params ParamSecs GFSA2 : values ParamSecs PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSB ============================ (NB = NB /\ LB = LB) /\ PSA = PSB
< case IsF. Subgoal 2: Variables: PSA NB LB PSB ParamSecs Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB GFSA : getFunSec (secfun NB RetTy LB RetVar RVVal Params Body) NB LB PSA @ GFSA1 : paramSecs Params ParamSecs GFSA2 : values ParamSecs PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSB H1 : is_string NB H2 : is_typ RetTy H3 : is_slev LB H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body ============================ (NB = NB /\ LB = LB) /\ PSA = PSB
< apply paramSecs_unique to _ GFSA1 GFSB. Subgoal 2: Variables: PSA NB LB PSB Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB GFSA : getFunSec (secfun NB RetTy LB RetVar RVVal Params Body) NB LB PSA @ GFSA1 : paramSecs Params ParamSecs1 GFSA2 : values ParamSecs1 PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSB H1 : is_string NB H2 : is_typ RetTy H3 : is_slev LB H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body ============================ (NB = NB /\ LB = LB) /\ PSA = PSB
< apply values_unique to GFSB1 GFSA2. Subgoal 2: Variables: PSA NB LB Body Params RVVal RetVar RetTy ParamSecs1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB GFSA : getFunSec (secfun NB RetTy LB RetVar RVVal Params Body) NB LB PSA @ GFSA1 : paramSecs Params ParamSecs1 GFSA2 : values ParamSecs1 PSA GFSB : paramSecs Params ParamSecs1 GFSB1 : values ParamSecs1 PSA H1 : is_string NB H2 : is_typ RetTy H3 : is_slev LB H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body ============================ (NB = NB /\ LB = LB) /\ PSA = PSA
< search. Subgoal 3: Variables: NA LA PSA NB LB PSB F_P IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun <unknown I fun> GFSA : getFunSec <unknown I fun> NA LA PSA @ GFSB : getFunSec <unknown I fun> NB LB PSB GFSA1 : |{fun}- <unknown I fun> ~~> F_P GFSA2 : getFunSec F_P NA LA PSA * ============================ (NA = NB /\ LA = LB) /\ PSA = PSB
< GFSB: case GFSB. Subgoal 3: Variables: NA LA PSA NB LB PSB F_P F_P1 IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun <unknown I fun> GFSA : getFunSec <unknown I fun> NA LA PSA @ GFSA1 : |{fun}- <unknown I fun> ~~> F_P GFSA2 : getFunSec F_P NA LA PSA * GFSB : |{fun}- <unknown I fun> ~~> F_P1 GFSB1 : getFunSec F_P1 NB LB PSB ============================ (NA = NB /\ LA = LB) /\ PSA = PSB
< apply proj_fun_unique to GFSB GFSA1 _. Subgoal 3: Variables: NA LA PSA NB LB PSB F_P IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun <unknown I fun> GFSA : getFunSec <unknown I fun> NA LA PSA @ GFSA1 : |{fun}- <unknown I fun> ~~> F_P GFSA2 : getFunSec F_P NA LA PSA * GFSB : |{fun}- <unknown I fun> ~~> F_P GFSB1 : getFunSec F_P NB LB PSB ============================ (NA = NB /\ LA = LB) /\ PSA = PSB
< apply proj_fun_is to GFSA1 _. Subgoal 3: Variables: NA LA PSA NB LB PSB F_P IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun <unknown I fun> GFSA : getFunSec <unknown I fun> NA LA PSA @ GFSA1 : |{fun}- <unknown I fun> ~~> F_P GFSA2 : getFunSec F_P NA LA PSA * GFSB : |{fun}- <unknown I fun> ~~> F_P GFSB1 : getFunSec F_P NB LB PSB H1 : is_fun F_P ============================ (NA = NB /\ LA = LB) /\ PSA = PSB
< apply IH to _ GFSA2 GFSB1. Subgoal 3: Variables: NB LB PSB F_P IH : forall F NA LA PSA NB LB PSB, is_fun F -> getFunSec F NA LA PSA * -> getFunSec F NB LB PSB -> (NA = NB /\ LA = LB) /\ PSA = PSB IsF : is_fun <unknown I fun> GFSA : getFunSec <unknown I fun> NB LB PSB @ GFSA1 : |{fun}- <unknown I fun> ~~> F_P GFSA2 : getFunSec F_P NB LB PSB * GFSB : |{fun}- <unknown I fun> ~~> F_P GFSB1 : getFunSec F_P NB LB PSB H1 : is_fun F_P ============================ (NB = NB /\ LB = LB) /\ PSB = PSB
< search. Proof completed.
< Theorem gatherFunSecCtx_unique : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA -> gatherFunSecCtx Fs SFB -> SFA = SFB. ============================ forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA -> gatherFunSecCtx Fs SFB -> SFA = SFB
< induction on 2. IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB ============================ forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA @ -> gatherFunSecCtx Fs SFB -> SFA = SFB
< intros IsFs GA GB. Variables: Fs SFA SFB IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB IsFs : is_list is_fun Fs GA : gatherFunSecCtx Fs SFA @ GB : gatherFunSecCtx Fs SFB ============================ SFA = SFB
< GA: case GA. Subgoal 1: Variables: SFB IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB IsFs : is_list is_fun [] GB : gatherFunSecCtx [] SFB ============================ [] = SFB
< case GB. Subgoal 1: IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB IsFs : is_list is_fun [] ============================ [] = []
< search. Subgoal 2: Variables: SFB SRest PSecs Lev Name FRest F IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB IsFs : is_list is_fun (F::FRest) GB : gatherFunSecCtx (F::FRest) SFB GA : getFunSec F Name Lev PSecs GA1 : gatherFunSecCtx FRest SRest * ============================ (Name, (Lev, PSecs))::SRest = SFB
< GB: case GB. Subgoal 2: Variables: SRest PSecs Lev Name FRest F SRest1 PSecs1 Lev1 Name1 IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB IsFs : is_list is_fun (F::FRest) GA : getFunSec F Name Lev PSecs GA1 : gatherFunSecCtx FRest SRest * GB : getFunSec F Name1 Lev1 PSecs1 GB1 : gatherFunSecCtx FRest SRest1 ============================ (Name, (Lev, PSecs))::SRest = (Name1, (Lev1, PSecs1))::SRest1
< case IsFs. Subgoal 2: Variables: SRest PSecs Lev Name FRest F SRest1 PSecs1 Lev1 Name1 IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB GA : getFunSec F Name Lev PSecs GA1 : gatherFunSecCtx FRest SRest * GB : getFunSec F Name1 Lev1 PSecs1 GB1 : gatherFunSecCtx FRest SRest1 H1 : is_fun F H2 : is_list is_fun FRest ============================ (Name, (Lev, PSecs))::SRest = (Name1, (Lev1, PSecs1))::SRest1
< apply getFunSec_unique to _ GA GB. Subgoal 2: Variables: SRest FRest F SRest1 PSecs1 Lev1 Name1 IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB GA : getFunSec F Name1 Lev1 PSecs1 GA1 : gatherFunSecCtx FRest SRest * GB : getFunSec F Name1 Lev1 PSecs1 GB1 : gatherFunSecCtx FRest SRest1 H1 : is_fun F H2 : is_list is_fun FRest ============================ (Name1, (Lev1, PSecs1))::SRest = (Name1, (Lev1, PSecs1))::SRest1
< apply IH to _ GA1 GB1. Subgoal 2: Variables: FRest F SRest1 PSecs1 Lev1 Name1 IH : forall Fs SFA SFB, is_list is_fun Fs -> gatherFunSecCtx Fs SFA * -> gatherFunSecCtx Fs SFB -> SFA = SFB GA : getFunSec F Name1 Lev1 PSecs1 GA1 : gatherFunSecCtx FRest SRest1 * GB : getFunSec F Name1 Lev1 PSecs1 GB1 : gatherFunSecCtx FRest SRest1 H1 : is_fun F H2 : is_list is_fun FRest ============================ (Name1, (Lev1, PSecs1))::SRest1 = (Name1, (Lev1, PSecs1))::SRest1
< search. Proof completed.
< Extensible_Theorem program_secure_unique : forall P A B, IsP : is_program P -> SecA : programSecure P A -> SecB : programSecure P B -> A = B on SecA. Subgoal 1: Variables: A B SF Name RetLev Main Funs IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B IsP : is_program (program Funs Main) SecA : programSecure (program Funs Main) A @ SecB : programSecure (program Funs Main) B SecA1 : gatherFunSecCtx Funs SF SecA2 : getFunSec Main Name RetLev A SecA3 : funsSecure ((Name, (RetLev, A))::SF) Funs SecA4 : funSecure ((Name, (RetLev, A))::SF) Main ============================ A = B
< SecB: case SecB. Subgoal 1: Variables: A B SF Name RetLev Main Funs SF1 Name1 RetLev1 IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B IsP : is_program (program Funs Main) SecA : programSecure (program Funs Main) A @ SecA1 : gatherFunSecCtx Funs SF SecA2 : getFunSec Main Name RetLev A SecA3 : funsSecure ((Name, (RetLev, A))::SF) Funs SecA4 : funSecure ((Name, (RetLev, A))::SF) Main SecB : gatherFunSecCtx Funs SF1 SecB1 : getFunSec Main Name1 RetLev1 B SecB2 : funsSecure ((Name1, (RetLev1, B))::SF1) Funs SecB3 : funSecure ((Name1, (RetLev1, B))::SF1) Main ============================ A = B
< case IsP. Subgoal 1: Variables: A B SF Name RetLev Main Funs SF1 Name1 RetLev1 IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B SecA : programSecure (program Funs Main) A @ SecA1 : gatherFunSecCtx Funs SF SecA2 : getFunSec Main Name RetLev A SecA3 : funsSecure ((Name, (RetLev, A))::SF) Funs SecA4 : funSecure ((Name, (RetLev, A))::SF) Main SecB : gatherFunSecCtx Funs SF1 SecB1 : getFunSec Main Name1 RetLev1 B SecB2 : funsSecure ((Name1, (RetLev1, B))::SF1) Funs SecB3 : funSecure ((Name1, (RetLev1, B))::SF1) Main H1 : is_list is_fun Funs H2 : is_fun Main ============================ A = B
< apply getFunSec_unique to _ SecA2 SecB1. Subgoal 1: Variables: B SF Main Funs SF1 Name1 RetLev1 IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B SecA : programSecure (program Funs Main) B @ SecA1 : gatherFunSecCtx Funs SF SecA2 : getFunSec Main Name1 RetLev1 B SecA3 : funsSecure ((Name1, (RetLev1, B))::SF) Funs SecA4 : funSecure ((Name1, (RetLev1, B))::SF) Main SecB : gatherFunSecCtx Funs SF1 SecB1 : getFunSec Main Name1 RetLev1 B SecB2 : funsSecure ((Name1, (RetLev1, B))::SF1) Funs SecB3 : funSecure ((Name1, (RetLev1, B))::SF1) Main H1 : is_list is_fun Funs H2 : is_fun Main ============================ B = B
< search. Subgoal 2: Variables: A B P_P IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B IsP : is_program <unknown I program> SecA : programSecure <unknown I program> A @ SecB : programSecure <unknown I program> B SecA1 : |{program}- <unknown I program> ~~> P_P SecA2 : programSecure P_P A * ============================ A = B
< SecB: case SecB. Subgoal 2: Variables: A B P_P P_P1 IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B IsP : is_program <unknown I program> SecA : programSecure <unknown I program> A @ SecA1 : |{program}- <unknown I program> ~~> P_P SecA2 : programSecure P_P A * SecB : |{program}- <unknown I program> ~~> P_P1 SecB1 : programSecure P_P1 B ============================ A = B
< apply proj_program_unique to SecB SecA1 _. Subgoal 2: Variables: A B P_P IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B IsP : is_program <unknown I program> SecA : programSecure <unknown I program> A @ SecA1 : |{program}- <unknown I program> ~~> P_P SecA2 : programSecure P_P A * SecB : |{program}- <unknown I program> ~~> P_P SecB1 : programSecure P_P B ============================ A = B
< apply proj_program_is to SecA1 _. Subgoal 2: Variables: A B P_P IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B IsP : is_program <unknown I program> SecA : programSecure <unknown I program> A @ SecA1 : |{program}- <unknown I program> ~~> P_P SecA2 : programSecure P_P A * SecB : |{program}- <unknown I program> ~~> P_P SecB1 : programSecure P_P B H1 : is_program P_P ============================ A = B
< apply IH to _ SecA2 SecB1. Subgoal 2: Variables: B P_P IH : forall P A B, is_program P -> programSecure P A * -> programSecure P B -> A = B IsP : is_program <unknown I program> SecA : programSecure <unknown I program> B @ SecA1 : |{program}- <unknown I program> ~~> P_P SecA2 : programSecure P_P B * SecB : |{program}- <unknown I program> ~~> P_P SecB1 : programSecure P_P B H1 : is_program P_P ============================ B = B
< search. Proof completed.
< Extensible_Theorem paramName_paramSec : forall P N NS L, IsP : is_param P -> PN : paramName P N -> PS : paramSec P NS L -> N = NS on PS. Subgoal 1: Variables: N NS Ty IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param (param NS Ty) PN : paramName (param NS Ty) N PS : paramSec (param NS Ty) NS public @ ============================ N = NS
< case PN. Subgoal 1: Variables: N Ty IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param (param N Ty) PS : paramSec (param N Ty) N public @ ============================ N = N
< search. Subgoal 2: Variables: N NS L Ty IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param (secparam NS Ty L) PN : paramName (secparam NS Ty L) N PS : paramSec (secparam NS Ty L) NS L @ ============================ N = NS
< case PN. Subgoal 2: Variables: N L Ty IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param (secparam N Ty L) PS : paramSec (secparam N Ty L) N L @ ============================ N = N
< search. Subgoal 3: Variables: N NS L P_P IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param <unknown I param> PN : paramName <unknown I param> N PS : paramSec <unknown I param> NS L @ PS1 : |{param}- <unknown I param> ~~> P_P PS2 : paramSec P_P NS L * ============================ N = NS
< PN': apply proj_paramName_forward to PS1 _ PN. Subgoal 3: Variables: N NS L P_P IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param <unknown I param> PN : paramName <unknown I param> N PS : paramSec <unknown I param> NS L @ PS1 : |{param}- <unknown I param> ~~> P_P PS2 : paramSec P_P NS L * PN' : paramName P_P N ============================ N = NS
< apply proj_param_is to PS1 _. Subgoal 3: Variables: N NS L P_P IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param <unknown I param> PN : paramName <unknown I param> N PS : paramSec <unknown I param> NS L @ PS1 : |{param}- <unknown I param> ~~> P_P PS2 : paramSec P_P NS L * PN' : paramName P_P N H1 : is_param P_P ============================ N = NS
< apply IH to _ PN' PS2. Subgoal 3: Variables: NS L P_P IH : forall P N NS L, is_param P -> paramName P N -> paramSec P NS L * -> N = NS IsP : is_param <unknown I param> PN : paramName <unknown I param> NS PS : paramSec <unknown I param> NS L @ PS1 : |{param}- <unknown I param> ~~> P_P PS2 : paramSec P_P NS L * PN' : paramName P_P NS H1 : is_param P_P ============================ NS = NS
< search. Proof completed.
< Theorem paramNames_paramSecs : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs -> domain PSecs PNs. ============================ forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs -> domain PSecs PNs
< induction on 3. IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs ============================ forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs @ -> domain PSecs PNs
< intros IsPs PNs PSecs. Variables: Ps PNs PSecs IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs IsPs : is_list is_param Ps PNs : paramNames Ps PNs PSecs : paramSecs Ps PSecs @ ============================ domain PSecs PNs
< PSecs: case PSecs. Subgoal 1: Variables: PNs IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs IsPs : is_list is_param [] PNs : paramNames [] PNs ============================ domain [] PNs
< case PNs. Subgoal 1: IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs IsPs : is_list is_param [] ============================ domain [] []
< search. Subgoal 2: Variables: PNs SRest L Name PRest P IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs IsPs : is_list is_param (P::PRest) PNs : paramNames (P::PRest) PNs PSecs : paramSec P Name L PSecs1 : paramSecs PRest SRest * ============================ domain ((Name, L)::SRest) PNs
< case IsPs. Subgoal 2: Variables: PNs SRest L Name PRest P IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs PNs : paramNames (P::PRest) PNs PSecs : paramSec P Name L PSecs1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest ============================ domain ((Name, L)::SRest) PNs
< PNs: case PNs. Subgoal 2: Variables: SRest L Name PRest P NRest N IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs PSecs : paramSec P Name L PSecs1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest PNs : paramName P N PNs1 : paramNames PRest NRest ============================ domain ((Name, L)::SRest) (N::NRest)
< apply paramName_paramSec to _ PNs PSecs. Subgoal 2: Variables: SRest L Name PRest P NRest IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs PSecs : paramSec P Name L PSecs1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest PNs : paramName P Name PNs1 : paramNames PRest NRest ============================ domain ((Name, L)::SRest) (Name::NRest)
< apply IH to _ PNs1 PSecs1. Subgoal 2: Variables: SRest L Name PRest P NRest IH : forall Ps PNs PSecs, is_list is_param Ps -> paramNames Ps PNs -> paramSecs Ps PSecs * -> domain PSecs PNs PSecs : paramSec P Name L PSecs1 : paramSecs PRest SRest * H1 : is_param P H2 : is_list is_param PRest PNs : paramName P Name PNs1 : paramNames PRest NRest H3 : domain SRest NRest ============================ domain ((Name, L)::SRest) (Name::NRest)
< search. Proof completed.
< Theorem domain_values_zip [A, B] : forall (L : list (pair A B)) D V, domain L D -> values L V -> zip D V L. ============================ forall L D V, domain L D -> values L V -> zip D V L
< induction on 1. IH : forall L D V, domain L D * -> values L V -> zip D V L ============================ forall L D V, domain L D @ -> values L V -> zip D V L
< intros D V. Variables: L D V IH : forall L D V, domain L D * -> values L V -> zip D V L D : domain L D @ V : values L V ============================ zip D V L
< D: case D. Subgoal 1: Variables: V IH : forall L D V, domain L D * -> values L V -> zip D V L V : values [] V ============================ zip [] V []
< case V. Subgoal 1: IH : forall L D V, domain L D * -> values L V -> zip D V L ============================ zip [] [] []
< search. Subgoal 2: Variables: V DRest A Rest B IH : forall L D V, domain L D * -> values L V -> zip D V L V : values ((A, B)::Rest) V D : domain Rest DRest * ============================ zip (A::DRest) V ((A, B)::Rest)
< V: case V. Subgoal 2: Variables: DRest A Rest B VRest IH : forall L D V, domain L D * -> values L V -> zip D V L D : domain Rest DRest * V : values Rest VRest ============================ zip (A::DRest) (B::VRest) ((A, B)::Rest)
< apply IH to D V. Subgoal 2: Variables: DRest A Rest B VRest IH : forall L D V, domain L D * -> values L V -> zip D V L D : domain Rest DRest * V : values Rest VRest H1 : zip DRest VRest Rest ============================ zip (A::DRest) (B::VRest) ((A, B)::Rest)
< search. Proof completed.
< Extensible_Theorem getFun_sec : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, IsF : is_fun F -> GFEI : getFunEvalInfo F FName RetVar RVVal PNames Body -> GFS : getFunSec F SName RetLev PSecs -> FS : funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG on GFS. Subgoal 1: Variables: FName RetVar RVVal PNames Body SName PSecs SF ParamSecs Body1 Params RVVal1 RetVar1 RetTy IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun (fun SName RetTy RetVar1 RVVal1 Params Body1) GFEI : getFunEvalInfo (fun SName RetTy RetVar1 RVVal1 Params Body1) FName RetVar RVVal PNames Body GFS : getFunSec (fun SName RetTy RetVar1 RVVal1 Params Body1) SName public PSecs @ FS : funSecure SF (fun SName RetTy RetVar1 RVVal1 Params Body1) GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< case IsF. Subgoal 1: Variables: FName RetVar RVVal PNames Body SName PSecs SF ParamSecs Body1 Params RVVal1 RetVar1 RetTy IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFEI : getFunEvalInfo (fun SName RetTy RetVar1 RVVal1 Params Body1) FName RetVar RVVal PNames Body GFS : getFunSec (fun SName RetTy RetVar1 RVVal1 Params Body1) SName public PSecs @ FS : funSecure SF (fun SName RetTy RetVar1 RVVal1 Params Body1) GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string SName H2 : is_typ RetTy H3 : is_string RetVar1 H4 : is_value RVVal1 H5 : is_list is_param Params H6 : is_stmt Body1 ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< GFEI: case GFEI. Subgoal 1: Variables: FName RetVar RVVal PNames Body PSecs SF ParamSecs Params RetTy IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (fun FName RetTy RetVar RVVal Params Body) FName public PSecs @ FS : funSecure SF (fun FName RetTy RetVar RVVal Params Body) GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body GFEI : paramNames Params PNames ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< FS: case FS. Subgoal 1: Variables: FName RetVar RVVal PNames Body PSecs SF ParamSecs Params RetTy ParamSecs1 SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (fun FName RetTy RetVar RVVal Params Body) FName public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs1 FS1 : secure SF [(RetVar, public)::ParamSecs1] public Body SG FS2 : lookup SF FName (public, PSecs1) FS3 : values ParamSecs1 PSecs1 ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< Dmn: apply paramNames_paramSecs to _ GFEI FS. Subgoal 1: Variables: FName RetVar RVVal PNames Body PSecs SF ParamSecs Params RetTy ParamSecs1 SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (fun FName RetTy RetVar RVVal Params Body) FName public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs1 FS1 : secure SF [(RetVar, public)::ParamSecs1] public Body SG FS2 : lookup SF FName (public, PSecs1) FS3 : values ParamSecs1 PSecs1 Dmn : domain ParamSecs1 PNames ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< Z: apply domain_values_zip to Dmn FS3. Subgoal 1: Variables: FName RetVar RVVal PNames Body PSecs SF ParamSecs Params RetTy ParamSecs1 SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (fun FName RetTy RetVar RVVal Params Body) FName public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs1 FS1 : secure SF [(RetVar, public)::ParamSecs1] public Body SG FS2 : lookup SF FName (public, PSecs1) FS3 : values ParamSecs1 PSecs1 Dmn : domain ParamSecs1 PNames Z : zip PNames PSecs1 ParamSecs1 ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< apply paramSecs_unique to _ FS GFS1. Subgoal 1: Variables: FName RetVar RVVal PNames Body PSecs SF ParamSecs Params RetTy SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (fun FName RetTy RetVar RVVal Params Body) FName public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs FS1 : secure SF [(RetVar, public)::ParamSecs] public Body SG FS2 : lookup SF FName (public, PSecs1) FS3 : values ParamSecs PSecs1 Dmn : domain ParamSecs PNames Z : zip PNames PSecs1 ParamSecs ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< apply values_unique to FS3 GFS2. Subgoal 1: Variables: FName RetVar RVVal PNames Body PSecs SF ParamSecs Params RetTy SG IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (fun FName RetTy RetVar RVVal Params Body) FName public PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_string RetVar H4 : is_value RVVal H5 : is_list is_param Params H6 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs FS1 : secure SF [(RetVar, public)::ParamSecs] public Body SG FS2 : lookup SF FName (public, PSecs) FS3 : values ParamSecs PSecs Dmn : domain ParamSecs PNames Z : zip PNames PSecs ParamSecs ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, public)::ZP] public Body SG
< search. Subgoal 2: Variables: FName RetVar RVVal PNames Body SName RetLev PSecs SF ParamSecs Body1 Params RVVal1 RetVar1 RetTy IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun (secfun SName RetTy RetLev RetVar1 RVVal1 Params Body1) GFEI : getFunEvalInfo (secfun SName RetTy RetLev RetVar1 RVVal1 Params Body1) FName RetVar RVVal PNames Body GFS : getFunSec (secfun SName RetTy RetLev RetVar1 RVVal1 Params Body1) SName RetLev PSecs @ FS : funSecure SF (secfun SName RetTy RetLev RetVar1 RVVal1 Params Body1) GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< case IsF. Subgoal 2: Variables: FName RetVar RVVal PNames Body SName RetLev PSecs SF ParamSecs Body1 Params RVVal1 RetVar1 RetTy IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFEI : getFunEvalInfo (secfun SName RetTy RetLev RetVar1 RVVal1 Params Body1) FName RetVar RVVal PNames Body GFS : getFunSec (secfun SName RetTy RetLev RetVar1 RVVal1 Params Body1) SName RetLev PSecs @ FS : funSecure SF (secfun SName RetTy RetLev RetVar1 RVVal1 Params Body1) GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string SName H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar1 H5 : is_value RVVal1 H6 : is_list is_param Params H7 : is_stmt Body1 ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< GFEI: case GFEI. Subgoal 2: Variables: FName RetVar RVVal PNames Body RetLev PSecs SF ParamSecs Params RetTy IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (secfun FName RetTy RetLev RetVar RVVal Params Body) FName RetLev PSecs @ FS : funSecure SF (secfun FName RetTy RetLev RetVar RVVal Params Body) GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body GFEI : paramNames Params PNames ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< FS: case FS. Subgoal 2: Variables: FName RetVar RVVal PNames Body RetLev PSecs SF ParamSecs Params RetTy ParamSecs1 SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (secfun FName RetTy RetLev RetVar RVVal Params Body) FName RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs1 FS1 : secure SF [(RetVar, RetLev)::ParamSecs1] RetLev Body SG FS2 : lookup SF FName (RetLev, PSecs1) FS3 : values ParamSecs1 PSecs1 ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< Dmn: apply paramNames_paramSecs to _ GFEI FS. Subgoal 2: Variables: FName RetVar RVVal PNames Body RetLev PSecs SF ParamSecs Params RetTy ParamSecs1 SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (secfun FName RetTy RetLev RetVar RVVal Params Body) FName RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs1 FS1 : secure SF [(RetVar, RetLev)::ParamSecs1] RetLev Body SG FS2 : lookup SF FName (RetLev, PSecs1) FS3 : values ParamSecs1 PSecs1 Dmn : domain ParamSecs1 PNames ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< Z: apply domain_values_zip to Dmn FS3. Subgoal 2: Variables: FName RetVar RVVal PNames Body RetLev PSecs SF ParamSecs Params RetTy ParamSecs1 SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (secfun FName RetTy RetLev RetVar RVVal Params Body) FName RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs1 FS1 : secure SF [(RetVar, RetLev)::ParamSecs1] RetLev Body SG FS2 : lookup SF FName (RetLev, PSecs1) FS3 : values ParamSecs1 PSecs1 Dmn : domain ParamSecs1 PNames Z : zip PNames PSecs1 ParamSecs1 ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< apply paramSecs_unique to _ FS GFS1. Subgoal 2: Variables: FName RetVar RVVal PNames Body RetLev PSecs SF ParamSecs Params RetTy SG PSecs1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (secfun FName RetTy RetLev RetVar RVVal Params Body) FName RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs FS1 : secure SF [(RetVar, RetLev)::ParamSecs] RetLev Body SG FS2 : lookup SF FName (RetLev, PSecs1) FS3 : values ParamSecs PSecs1 Dmn : domain ParamSecs PNames Z : zip PNames PSecs1 ParamSecs ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< apply values_unique to FS3 GFS2. Subgoal 2: Variables: FName RetVar RVVal PNames Body RetLev PSecs SF ParamSecs Params RetTy SG IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG GFS : getFunSec (secfun FName RetTy RetLev RetVar RVVal Params Body) FName RetLev PSecs @ GFS1 : paramSecs Params ParamSecs GFS2 : values ParamSecs PSecs H1 : is_string FName H2 : is_typ RetTy H3 : is_slev RetLev H4 : is_string RetVar H5 : is_value RVVal H6 : is_list is_param Params H7 : is_stmt Body GFEI : paramNames Params PNames FS : paramSecs Params ParamSecs FS1 : secure SF [(RetVar, RetLev)::ParamSecs] RetLev Body SG FS2 : lookup SF FName (RetLev, PSecs) FS3 : values ParamSecs PSecs Dmn : domain ParamSecs PNames Z : zip PNames PSecs ParamSecs ============================ exists ZP SG, (FName = FName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< search. Subgoal 3: Variables: FName RetVar RVVal PNames Body SName RetLev PSecs SF F_P IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun <unknown I fun> GFEI : getFunEvalInfo <unknown I fun> FName RetVar RVVal PNames Body GFS : getFunSec <unknown I fun> SName RetLev PSecs @ FS : funSecure SF <unknown I fun> GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P SName RetLev PSecs * ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< GFEI': apply proj_getFunEvalInfo_forward to GFS1 _ GFEI. Subgoal 3: Variables: FName RetVar RVVal PNames Body SName RetLev PSecs SF F_P IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun <unknown I fun> GFEI : getFunEvalInfo <unknown I fun> FName RetVar RVVal PNames Body GFS : getFunSec <unknown I fun> SName RetLev PSecs @ FS : funSecure SF <unknown I fun> GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P SName RetLev PSecs * GFEI' : getFunEvalInfo F_P FName RetVar RVVal PNames Body ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< apply proj_fun_is to GFS1 _. Subgoal 3: Variables: FName RetVar RVVal PNames Body SName RetLev PSecs SF F_P IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun <unknown I fun> GFEI : getFunEvalInfo <unknown I fun> FName RetVar RVVal PNames Body GFS : getFunSec <unknown I fun> SName RetLev PSecs @ FS : funSecure SF <unknown I fun> GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P SName RetLev PSecs * GFEI' : getFunEvalInfo F_P FName RetVar RVVal PNames Body H1 : is_fun F_P ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< FS: case FS. Subgoal 3: Variables: FName RetVar RVVal PNames Body SName RetLev PSecs SF F_P F_P1 IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun <unknown I fun> GFEI : getFunEvalInfo <unknown I fun> FName RetVar RVVal PNames Body GFS : getFunSec <unknown I fun> SName RetLev PSecs @ GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P SName RetLev PSecs * GFEI' : getFunEvalInfo F_P FName RetVar RVVal PNames Body H1 : is_fun F_P FS : |{fun}- <unknown I fun> ~~> F_P1 FS1 : funSecure SF F_P1 ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< apply proj_fun_unique to FS GFS1 _. Subgoal 3: Variables: FName RetVar RVVal PNames Body SName RetLev PSecs SF F_P IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun <unknown I fun> GFEI : getFunEvalInfo <unknown I fun> FName RetVar RVVal PNames Body GFS : getFunSec <unknown I fun> SName RetLev PSecs @ GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P SName RetLev PSecs * GFEI' : getFunEvalInfo F_P FName RetVar RVVal PNames Body H1 : is_fun F_P FS : |{fun}- <unknown I fun> ~~> F_P FS1 : funSecure SF F_P ============================ exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< apply IH to _ GFEI' GFS2 FS1. Subgoal 3: Variables: RetVar RVVal PNames Body SName RetLev PSecs SF F_P ZP SG IH : forall F FName RetVar RVVal PNames Body SName RetLev PSecs SF, is_fun F -> getFunEvalInfo F FName RetVar RVVal PNames Body -> getFunSec F SName RetLev PSecs * -> funSecure SF F -> exists ZP SG, (FName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG IsF : is_fun <unknown I fun> GFEI : getFunEvalInfo <unknown I fun> SName RetVar RVVal PNames Body GFS : getFunSec <unknown I fun> SName RetLev PSecs @ GFS1 : |{fun}- <unknown I fun> ~~> F_P GFS2 : getFunSec F_P SName RetLev PSecs * GFEI' : getFunEvalInfo F_P SName RetVar RVVal PNames Body H1 : is_fun F_P FS : |{fun}- <unknown I fun> ~~> F_P FS1 : funSecure SF F_P H2 : zip PNames PSecs ZP H3 : secure SF [(RetVar, RetLev)::ZP] RetLev Body SG ============================ exists ZP SG, (SName = SName /\ zip PNames PSecs ZP) /\ secure SF [(RetVar, RetLev)::ZP] RetLev Body SG
< search. Proof completed.
< Theorem gatherCtxs_secFunCtxs : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, RVVal, PNames, Body) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG. ============================ forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< induction on 5. IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG ============================ forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) @ -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< intros IsFs GFSC GFEC FS LS LE. Variables: Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun Fs GFSC : gatherFunSecCtx Fs SF GFEC : getFunEvalCtx Fs FE FS : funsSecure SF_Full Fs LS : lookup SF FName (RetLev, PSecs) @ LE : lookup FE FName (RetVar, (RVVal, (PNames, Body))) ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< LS: case LS. Subgoal 1: Variables: Fs FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun Fs GFSC : gatherFunSecCtx Fs ((FName, (RetLev, PSecs))::Rest) GFEC : getFunEvalCtx Fs FE FS : funsSecure SF_Full Fs LE : lookup FE FName (RetVar, (RVVal, (PNames, Body))) ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< GFSC: case GFSC. Subgoal 1: Variables: FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest FRest F IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun (F::FRest) GFEC : getFunEvalCtx (F::FRest) FE FS : funsSecure SF_Full (F::FRest) LE : lookup FE FName (RetVar, (RVVal, (PNames, Body))) GFSC : getFunSec F FName RetLev PSecs GFSC1 : gatherFunSecCtx FRest Rest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< GFEC: case GFEC. Subgoal 1: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest FRest F CRest Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun (F::FRest) FS : funsSecure SF_Full (F::FRest) LE : lookup ((FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) GFSC : getFunSec F FName RetLev PSecs GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< FS: case FS. Subgoal 1: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest FRest F CRest Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun (F::FRest) LE : lookup ((FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) GFSC : getFunSec F FName RetLev PSecs GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< case IsFs. Subgoal 1: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest FRest F CRest Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG LE : lookup ((FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) GFSC : getFunSec F FName RetLev PSecs GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< apply getFun_sec to _ GFEC GFSC FS. Subgoal 1: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest FRest F CRest Body1 PNames1 RVVal1 RetVar1 ZP SG IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG LE : lookup ((FName, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) GFSC : getFunSec F FName RetLev PSecs GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest H3 : zip PNames1 PSecs ZP H4 : secure SF_Full [(RetVar1, RetLev)::ZP] RetLev Body1 SG ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< LE: case LE. Subgoal 1.1: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest FRest F CRest ZP SG IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG GFSC : getFunSec F FName RetLev PSecs GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName RetVar RVVal PNames Body GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest H3 : zip PNames PSecs ZP H4 : secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< search. Subgoal 1.2: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest FRest F CRest Body1 PNames1 RVVal1 RetVar1 ZP SG IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG GFSC : getFunSec F FName RetLev PSecs GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest H3 : zip PNames1 PSecs ZP H4 : secure SF_Full [(RetVar1, RetLev)::ZP] RetLev Body1 SG LE : FName = FName -> false LE1 : lookup CRest FName (RetVar, (RVVal, (PNames, Body))) ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< apply LE to _. Subgoal 2: Variables: Fs FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest V K IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun Fs GFSC : gatherFunSecCtx Fs ((K, V)::Rest) GFEC : getFunEvalCtx Fs FE FS : funsSecure SF_Full Fs LE : lookup FE FName (RetVar, (RVVal, (PNames, Body))) LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< GFSC: case GFSC. Subgoal 2: Variables: FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest K PSecs1 Lev FRest F IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun (F::FRest) GFEC : getFunEvalCtx (F::FRest) FE FS : funsSecure SF_Full (F::FRest) LE : lookup FE FName (RetVar, (RVVal, (PNames, Body))) LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F K Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< GFEC: case GFEC. Subgoal 2: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest K PSecs1 Lev FRest F CRest Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun (F::FRest) FS : funsSecure SF_Full (F::FRest) LE : lookup ((FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F K Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< FS: case FS. Subgoal 2: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest K PSecs1 Lev FRest F CRest Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG IsFs : is_list is_fun (F::FRest) LE : lookup ((FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F K Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< case IsFs. Subgoal 2: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest K PSecs1 Lev FRest F CRest Body1 PNames1 RVVal1 RetVar1 FName1 IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG LE : lookup ((FName1, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F K Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName1 RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< apply getFun_sec to _ GFEC GFSC FS. Subgoal 2: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest K PSecs1 Lev FRest F CRest Body1 PNames1 RVVal1 RetVar1 ZP SG IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG LE : lookup ((K, (RetVar1, (RVVal1, (PNames1, Body1))))::CRest) FName (RetVar, (RVVal, (PNames, Body))) LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F K Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F K RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest H3 : zip PNames1 PSecs1 ZP H4 : secure SF_Full [(RetVar1, Lev)::ZP] Lev Body1 SG ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< LE: case LE. Subgoal 2.1: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest PSecs1 Lev FRest F CRest ZP SG IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG LS : FName = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F FName Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F FName RetVar RVVal PNames Body GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest H3 : zip PNames PSecs1 ZP H4 : secure SF_Full [(RetVar, Lev)::ZP] Lev Body SG ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< apply LS to _. Subgoal 2.2: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest K PSecs1 Lev FRest F CRest Body1 PNames1 RVVal1 RetVar1 ZP SG IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F K Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F K RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest H3 : zip PNames1 PSecs1 ZP H4 : secure SF_Full [(RetVar1, Lev)::ZP] Lev Body1 SG LE : K = FName -> false LE1 : lookup CRest FName (RetVar, (RVVal, (PNames, Body))) ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< apply IH to _ GFSC1 GFEC1 FS1 LS1 LE1. Subgoal 2.2: Variables: SF_Full FName RetLev PSecs RetVar RVVal PNames Body Rest K PSecs1 Lev FRest F CRest Body1 PNames1 RVVal1 RetVar1 ZP SG ZP1 SG1 IH : forall Fs SF FE SF_Full FName RetLev PSecs RetVar RVVal PNames Body, is_list is_fun Fs -> gatherFunSecCtx Fs SF -> getFunEvalCtx Fs FE -> funsSecure SF_Full Fs -> lookup SF FName (RetLev, PSecs) * -> lookup FE FName (RetVar, (RVVal, (PNames, Body))) -> exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG LS : K = FName -> false LS1 : lookup Rest FName (RetLev, PSecs) * GFSC : getFunSec F K Lev PSecs1 GFSC1 : gatherFunSecCtx FRest Rest GFEC : getFunEvalInfo F K RetVar1 RVVal1 PNames1 Body1 GFEC1 : getFunEvalCtx FRest CRest FS : funSecure SF_Full F FS1 : funsSecure SF_Full FRest H1 : is_fun F H2 : is_list is_fun FRest H3 : zip PNames1 PSecs1 ZP H4 : secure SF_Full [(RetVar1, Lev)::ZP] Lev Body1 SG LE : K = FName -> false LE1 : lookup CRest FName (RetVar, (RVVal, (PNames, Body))) H5 : zip PNames PSecs ZP1 H6 : secure SF_Full [(RetVar, RetLev)::ZP1] RetLev Body SG1 ============================ exists ZP SG, zip PNames PSecs ZP /\ secure SF_Full [(RetVar, RetLev)::ZP] RetLev Body SG
< search. Proof completed.
< Extensible_Theorem program_secure : forall P A_S A_A A_B O_A O_B, IsP : is_program P -> IsA_A : is_list is_value A_A -> IsA_B : is_list is_value A_B -> Sec : programSecure P A_S -> Rel : level_arg_vals A_S A_A A_B -> EvA : evalProgram A_A P O_A -> EvB : evalProgram A_B P O_B -> O_A = O_B on Sec. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsP : is_program (program Funs Main) IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B EvA : evalProgram A_A (program Funs Main) O_A EvB : evalProgram A_B (program Funs Main) O_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main ============================ O_A = O_B
< case IsP. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B EvA : evalProgram A_A (program Funs Main) O_A EvB : evalProgram A_B (program Funs Main) O_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main ============================ O_A = O_B
< EvA: case EvA. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx MainName RetVar RetVal PNames Body InitEnv EE IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B EvB : evalProgram A_B (program Funs Main) O_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A ============================ O_A = O_B
< EvB: case EvB. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx MainName RetVar RetVal PNames Body InitEnv EE FCtx1 MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx1 EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A_B InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx1) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 O_B ============================ O_A = O_B
< apply getFunEvalCtx_unique to _ EvB EvA. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx MainName RetVar RetVal PNames Body InitEnv EE MainName1 RetVar1 RetVal1 PNames1 Body1 InitEnv1 EE1 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main MainName1 RetVar1 RetVal1 PNames1 Body1 EvB2 : zip PNames1 A_B InitEnv1 EvB3 : evalStmt ((MainName1, (RetVar1, (RetVal1, (PNames1, Body1))))::FCtx) [(RetVar1, RetVal1)::InitEnv1] Body1 EE1 O_B ============================ O_A = O_B
< apply getFunEvalInfo_unique to _ EvB1 EvA1. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx MainName RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B ============================ O_A = O_B
< apply gatherFunSecCtx_is to _ Sec1. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx MainName RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF ============================ O_A = O_B
< apply getFunSec_is to _ Sec2. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx MainName RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main MainName RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((MainName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S ============================ O_A = O_B
< MainS: apply getFun_sec to _ EvA1 Sec2 Sec4. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG ============================ O_A = O_B
< assert secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, RetVal, PNames, Body))::FCtx). Subgoal 1.1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG ============================ secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx)
< unfold . Subgoal 1.1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG ============================ forall FName RetLev1 PSecs RetVar1 RVVal PNames1 Body1, lookup ((Name, (RetLev, A_S))::SF) FName (RetLev1, PSecs) -> lookup ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) FName (RetVar1, (RVVal, (PNames1, Body1))) -> exists ZP SG, zip PNames1 PSecs ZP /\ secure ((Name, (RetLev, A_S))::SF) [(RetVar1, RetLev1)::ZP] RetLev1 Body1 SG
< intros LS LE. Subgoal 1.1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG LS : lookup ((Name, (RetLev, A_S))::SF) FName (RetLev1, PSecs) LE : lookup ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) FName (RetVar2, (RVVal, (PNames2, Body2))) ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((Name, (RetLev, A_S))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< LS: case LS. Subgoal 1.1.1: Variables: A_A A_B O_A O_B SF Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) PSecs @ Rel : level_arg_vals PSecs A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main FName RetLev1 PSecs Sec3 : funsSecure ((FName, (RetLev1, PSecs))::SF) Funs Sec4 : funSecure ((FName, (RetLev1, PSecs))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main FName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((FName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main FName RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((FName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string FName H5 : is_slev RetLev1 H6 : is_list is_slev PSecs MainS : zip PNames PSecs ZP MainS1 : secure ((FName, (RetLev1, PSecs))::SF) [(RetVar, RetLev1)::ZP] RetLev1 Body SG LE : lookup ((FName, (RetVar, (RetVal, (PNames, Body))))::FCtx) FName (RetVar2, (RVVal, (PNames2, Body2))) ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((FName, (RetLev1, PSecs))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< LE: case LE. Subgoal 1.1.1.1: Variables: A_A A_B O_A O_B SF Main Funs FCtx InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) PSecs @ Rel : level_arg_vals PSecs A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main FName RetLev1 PSecs Sec3 : funsSecure ((FName, (RetLev1, PSecs))::SF) Funs Sec4 : funSecure ((FName, (RetLev1, PSecs))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main FName RetVar2 RVVal PNames2 Body2 EvA2 : zip PNames2 A_A InitEnv EvA3 : evalStmt ((FName, (RetVar2, (RVVal, (PNames2, Body2))))::FCtx) [(RetVar2, RVVal)::InitEnv] Body2 EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main FName RetVar2 RVVal PNames2 Body2 EvB2 : zip PNames2 A_B InitEnv1 EvB3 : evalStmt ((FName, (RetVar2, (RVVal, (PNames2, Body2))))::FCtx) [(RetVar2, RVVal)::InitEnv1] Body2 EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string FName H5 : is_slev RetLev1 H6 : is_list is_slev PSecs MainS : zip PNames2 PSecs ZP MainS1 : secure ((FName, (RetLev1, PSecs))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((FName, (RetLev1, PSecs))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< search. Subgoal 1.1.1.2: Variables: A_A A_B O_A O_B SF Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) PSecs @ Rel : level_arg_vals PSecs A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main FName RetLev1 PSecs Sec3 : funsSecure ((FName, (RetLev1, PSecs))::SF) Funs Sec4 : funSecure ((FName, (RetLev1, PSecs))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main FName RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((FName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main FName RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((FName, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string FName H5 : is_slev RetLev1 H6 : is_list is_slev PSecs MainS : zip PNames PSecs ZP MainS1 : secure ((FName, (RetLev1, PSecs))::SF) [(RetVar, RetLev1)::ZP] RetLev1 Body SG LE : FName = FName -> false LE1 : lookup FCtx FName (RetVar2, (RVVal, (PNames2, Body2))) ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((FName, (RetLev1, PSecs))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< apply LE to _. Subgoal 1.1.2: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG LE : lookup ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) FName (RetVar2, (RVVal, (PNames2, Body2))) LS : Name = FName -> false LS1 : lookup SF FName (RetLev1, PSecs) ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((Name, (RetLev, A_S))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< LE: case LE. Subgoal 1.1.2.1: Variables: A_S A_A A_B O_A O_B SF RetLev Main Funs FCtx InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main FName RetLev A_S Sec3 : funsSecure ((FName, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((FName, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main FName RetVar2 RVVal PNames2 Body2 EvA2 : zip PNames2 A_A InitEnv EvA3 : evalStmt ((FName, (RetVar2, (RVVal, (PNames2, Body2))))::FCtx) [(RetVar2, RVVal)::InitEnv] Body2 EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main FName RetVar2 RVVal PNames2 Body2 EvB2 : zip PNames2 A_B InitEnv1 EvB3 : evalStmt ((FName, (RetVar2, (RVVal, (PNames2, Body2))))::FCtx) [(RetVar2, RVVal)::InitEnv1] Body2 EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string FName H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames2 A_S ZP MainS1 : secure ((FName, (RetLev, A_S))::SF) [(RetVar2, RetLev)::ZP] RetLev Body2 SG LS : FName = FName -> false LS1 : lookup SF FName (RetLev1, PSecs) ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((FName, (RetLev, A_S))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< apply LS to _. Subgoal 1.1.2.2: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG LS : Name = FName -> false LS1 : lookup SF FName (RetLev1, PSecs) LE : Name = FName -> false LE1 : lookup FCtx FName (RetVar2, (RVVal, (PNames2, Body2))) ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((Name, (RetLev, A_S))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< apply gatherCtxs_secFunCtxs to _ Sec1 EvA Sec3 LS1 LE1. Subgoal 1.1.2.2: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG FName RetLev1 PSecs RetVar2 RVVal PNames2 Body2 ZP1 SG1 IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG LS : Name = FName -> false LS1 : lookup SF FName (RetLev1, PSecs) LE : Name = FName -> false LE1 : lookup FCtx FName (RetVar2, (RVVal, (PNames2, Body2))) H7 : zip PNames2 PSecs ZP1 H8 : secure ((Name, (RetLev, A_S))::SF) [(RetVar2, RetLev1)::ZP1] RetLev1 Body2 SG1 ============================ exists ZP SG, zip PNames2 PSecs ZP /\ secure ((Name, (RetLev, A_S))::SF) [(RetVar2, RetLev1)::ZP] RetLev1 Body2 SG
< search. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ============================ O_A = O_B
< ZA: assert zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv). Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ============================ O_A = O_B
< ZB: assert zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1). Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ============================ O_A = O_B
< ZM: assert zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP). Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) ============================ O_A = O_B
< assert level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B). Subgoal 1.2: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) ============================ level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
< Or: apply is_slev_public_or_not to _ with L = RetLev. Subgoal 1.2: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) Or : RetLev = public \/ (RetLev = public -> false) ============================ level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
< case Or. Subgoal 1.2.1: Variables: A_S A_A A_B O_A O_B SF Name Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name public A_S Sec3 : funsSecure ((Name, (public, A_S))::SF) Funs Sec4 : funSecure ((Name, (public, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev public H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (public, A_S))::SF) [(RetVar, public)::ZP] public Body SG H7 : secFunCtxs ((Name, (public, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (public::A_S) ((RetVar, public)::ZP) ============================ level_arg_vals (public::A_S) (RetVal::A_A) (RetVal::A_B)
< search. Subgoal 1.2.2: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : RetLev = public -> false ============================ level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B)
< search. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) ============================ O_A = O_B
< PE: apply zip_level_arg_vals to _ ZA ZB ZM. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] ============================ O_A = O_B
< apply zip_names_same to ZA ZM. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] ============================ O_A = O_B
< apply zip_names_same to ZB ZM. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] ============================ O_A = O_B
< apply getFunEvalInfo_is to _ EvA1. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] H11 : is_string Name H12 : is_string RetVar H13 : is_value RetVal H14 : is_list is_string PNames H15 : is_stmt Body ============================ O_A = O_B
< apply getFunSec_is to _ Sec2. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] H11 : is_string Name H12 : is_string RetVar H13 : is_value RetVal H14 : is_list is_string PNames H15 : is_stmt Body H16 : is_string Name H17 : is_slev RetLev H18 : is_list is_slev A_S ============================ O_A = O_B
< apply zip_is to _ _ ZA. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] H11 : is_string Name H12 : is_string RetVar H13 : is_value RetVal H14 : is_list is_string PNames H15 : is_stmt Body H16 : is_string Name H17 : is_slev RetLev H18 : is_list is_slev A_S H19 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv) ============================ O_A = O_B
< apply zip_is to _ _ ZB. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] H11 : is_string Name H12 : is_string RetVar H13 : is_value RetVal H14 : is_list is_string PNames H15 : is_stmt Body H16 : is_string Name H17 : is_slev RetLev H18 : is_list is_slev A_S H19 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv) H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv1) ============================ O_A = O_B
< apply zip_is_sec to _ _ ZM. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] H11 : is_string Name H12 : is_string RetVar H13 : is_value RetVal H14 : is_list is_string PNames H15 : is_stmt Body H16 : is_string Name H17 : is_slev RetLev H18 : is_list is_slev A_S H19 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv) H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv1) H21 : is_list (is_pair is_string is_slev) ((RetVar, RetLev)::ZP) ============================ O_A = O_B
< apply getFunEvalCtx_is to _ EvA. Subgoal 1: Variables: A_S A_A A_B O_A O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_A EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] H11 : is_string Name H12 : is_string RetVar H13 : is_value RetVal H14 : is_list is_string PNames H15 : is_stmt Body H16 : is_string Name H17 : is_slev RetLev H18 : is_list is_slev A_S H19 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv) H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv1) H21 : is_list (is_pair is_string is_slev) ((RetVar, RetLev)::ZP) H22 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx ============================ O_A = O_B
< apply secure_output to _ _ _ _ _ _ _ _ _ _ _ MainS1 EvA3 EvB3. Subgoal 1: Variables: A_S A_A A_B O_B SF Name RetLev Main Funs FCtx RetVar RetVal PNames Body InitEnv EE InitEnv1 EE1 ZP SG IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure (program Funs Main) A_S @ Rel : level_arg_vals A_S A_A A_B Sec1 : gatherFunSecCtx Funs SF Sec2 : getFunSec Main Name RetLev A_S Sec3 : funsSecure ((Name, (RetLev, A_S))::SF) Funs Sec4 : funSecure ((Name, (RetLev, A_S))::SF) Main H1 : is_list is_fun Funs H2 : is_fun Main EvA : getFunEvalCtx Funs FCtx EvA1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvA2 : zip PNames A_A InitEnv EvA3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv] Body EE O_B EvB : getFunEvalCtx Funs FCtx EvB1 : getFunEvalInfo Main Name RetVar RetVal PNames Body EvB2 : zip PNames A_B InitEnv1 EvB3 : evalStmt ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) [(RetVar, RetVal)::InitEnv1] Body EE1 O_B H3 : is_list (is_pair is_string (is_pair is_slev (is_list is_slev))) SF H4 : is_string Name H5 : is_slev RetLev H6 : is_list is_slev A_S MainS : zip PNames A_S ZP MainS1 : secure ((Name, (RetLev, A_S))::SF) [(RetVar, RetLev)::ZP] RetLev Body SG H7 : secFunCtxs ((Name, (RetLev, A_S))::SF) ((Name, (RetVar, (RetVal, (PNames, Body))))::FCtx) ZA : zip (RetVar::PNames) (RetVal::A_A) ((RetVar, RetVal)::InitEnv) ZB : zip (RetVar::PNames) (RetVal::A_B) ((RetVar, RetVal)::InitEnv1) ZM : zip (RetVar::PNames) (RetLev::A_S) ((RetVar, RetLev)::ZP) H8 : level_arg_vals (RetLev::A_S) (RetVal::A_A) (RetVal::A_B) PE : public_equiv [(RetVar, RetLev)::ZP] [(RetVar, RetVal)::InitEnv] [(RetVar, RetVal)::InitEnv1] H9 : names_same [(RetVar, RetVal)::InitEnv] [(RetVar, RetLev)::ZP] H10 : names_same [(RetVar, RetVal)::InitEnv1] [(RetVar, RetLev)::ZP] H11 : is_string Name H12 : is_string RetVar H13 : is_value RetVal H14 : is_list is_string PNames H15 : is_stmt Body H16 : is_string Name H17 : is_slev RetLev H18 : is_list is_slev A_S H19 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv) H20 : is_list (is_pair is_string is_value) ((RetVar, RetVal)::InitEnv1) H21 : is_list (is_pair is_string is_slev) ((RetVar, RetLev)::ZP) H22 : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FCtx ============================ O_B = O_B
< search. Subgoal 2: Variables: A_S A_A A_B O_A O_B P_P IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsP : is_program <unknown I program> IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure <unknown I program> A_S @ Rel : level_arg_vals A_S A_A A_B EvA : evalProgram A_A <unknown I program> O_A EvB : evalProgram A_B <unknown I program> O_B Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P A_S * ============================ O_A = O_B
< EvA': apply proj_evalProgram_forward to Sec1 _ _ EvA. Subgoal 2: Variables: A_S A_A A_B O_A O_B P_P IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsP : is_program <unknown I program> IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure <unknown I program> A_S @ Rel : level_arg_vals A_S A_A A_B EvA : evalProgram A_A <unknown I program> O_A EvB : evalProgram A_B <unknown I program> O_B Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P A_S * EvA' : evalProgram A_A P_P O_A ============================ O_A = O_B
< EvB': apply proj_evalProgram_forward to Sec1 _ _ EvB. Subgoal 2: Variables: A_S A_A A_B O_A O_B P_P IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsP : is_program <unknown I program> IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure <unknown I program> A_S @ Rel : level_arg_vals A_S A_A A_B EvA : evalProgram A_A <unknown I program> O_A EvB : evalProgram A_B <unknown I program> O_B Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P A_S * EvA' : evalProgram A_A P_P O_A EvB' : evalProgram A_B P_P O_B ============================ O_A = O_B
< apply proj_program_is to Sec1 _. Subgoal 2: Variables: A_S A_A A_B O_A O_B P_P IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsP : is_program <unknown I program> IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure <unknown I program> A_S @ Rel : level_arg_vals A_S A_A A_B EvA : evalProgram A_A <unknown I program> O_A EvB : evalProgram A_B <unknown I program> O_B Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P A_S * EvA' : evalProgram A_A P_P O_A EvB' : evalProgram A_B P_P O_B H1 : is_program P_P ============================ O_A = O_B
< apply IH to _ _ _ Sec2 _ EvA' EvB'. Subgoal 2: Variables: A_S A_A A_B O_B P_P IH : forall P A_S A_A A_B O_A O_B, is_program P -> is_list is_value A_A -> is_list is_value A_B -> programSecure P A_S * -> level_arg_vals A_S A_A A_B -> evalProgram A_A P O_A -> evalProgram A_B P O_B -> O_A = O_B IsP : is_program <unknown I program> IsA_A : is_list is_value A_A IsA_B : is_list is_value A_B Sec : programSecure <unknown I program> A_S @ Rel : level_arg_vals A_S A_A A_B EvA : evalProgram A_A <unknown I program> O_B EvB : evalProgram A_B <unknown I program> O_B Sec1 : |{program}- <unknown I program> ~~> P_P Sec2 : programSecure P_P A_S * EvA' : evalProgram A_A P_P O_B EvB' : evalProgram A_B P_P O_B H1 : is_program P_P ============================ O_B = O_B
< search. Proof completed.